xamarin:Device.BeginInvokeOnMainThread 和 MainThread.BeginInvokeOnMainThread 之间的区别

luc*_*cba 1 c# xamarin

我创建了相同的自定义控件,在其中一些控件中我使用 Device.BeginInvokeOnMainThread 但有时它会引发错误:

System.NullReferenceException:未将对象引用设置为对象的实例

阅读后立即发生此错误Device.BeginInvokeOnMainThread,但如果我将其替换为MainThread.BeginInvokeOnMainThread工作正常。

部分代码如果是这样的:

public class EntryRoundPassword : RelativeLayout
    {
             public EntryRoundPassword() : base()
            {
                  // throws an error
                  Device.BeginInvokeOnMainThread(() =>
                  {
                      ......
                  });

                   //works ok
                   MainThread.BeginInvokeOnMainThread(() =>
                   {
                      .....
                   }); 
            }
    }
Run Code Online (Sandbox Code Playgroud)

它们之间有什么区别,因为一个抛出错误而另一个则不抛出错误?

Jas*_*son 7

MainThread是 的一部分Essentials,并且是较新的实现。该Device实现最终将被弃用。如果想了解具体的实现差异可以查看源码

  • @luciano cba Xamarin.Forms 有一个名为“Device.BeginInvokeOnMainThread(Action)”的方法,它与“MainThread.BeginInvokeOnMainThread(Action)”执行相同的操作。虽然可以在 Xamarin.Forms 应用中使用任一方法,但请考虑调用代码是否需要依赖于 Xamarin.Forms。如果没有,“MainThread.BeginInvokeOnMainThread(Action)”可能是更好的选择。 (2认同)