为什么我们需要在应用加载时使用BeginInvokeOnMainThread来显示DisplayAlert

时间:2019-02-28 08:56:05

标签: c# xamarin xamarin.forms xamarin.android xamarin.ios

此代码未显示DisplayAlert

public MainPage()
{
    InitializeComponent();
    DisplayAlert("Hey", "Welcome", "OK");
}

但是当我使用Device.BeginInvokeOnMainThread时会显示警报

public MainPage()
{
    InitializeComponent();
    Device.BeginInvokeOnMainThread(() => {
                DisplayAlert("Hey ", "Welcome", "OK");
            });
}

这仅发生在DisplayAlert还是其他控件中。谁能告诉我为什么会这样吗?

2 个答案:

答案 0 :(得分:4)

调用构造函数的原因很简单,原因是它与UIThread位于不同的线程上。现在,UI线程是UI上所有更改实际发生的地方。

注意

一个应用程序可以有n个不同的线程,但只有一个UIThread

因此,当您这样做时:

public MainPage()
{
   InitializeComponent();
   DisplayAlert("Hey", "Welcome", "OK");
}

发生的事情是它在构造函数的线程(不是UIThread)上运行,因此它被执行但从未在UI上显示,恰恰相反:

public MainPage()
{
   InitializeComponent();
   Device.BeginInvokeOnMainThread(() => {
            DisplayAlert("Hey ", "Welcome", "OK");
        });
}

BeginInvokeOnMainThread方法强制您的显示警报方法在UI线程上运行,从而使其在UIThread上可见。

我希望这对您有意义,

如果您不了解任何内容,请随时恢复。

祝你好运

答案 1 :(得分:2)

UI操作必须在主UI线程上发生。 BeginInvokeOnMainThread强制对UI线程进行后台线程操作