为什么非UI线程会阻止UI?

时间:2018-06-01 03:27:34

标签: c# multithreading xamarin

我在按钮单击事件处理程序中创建并启动一个线程。该线程执行一些同步工作,并通过触发事件通知UI线程进度。

问题是这会锁定UI线程,我不确定原因。

public partial class MainPage : ContentPage
{
    private event EventHandler<double> ProgressChanged;

    public MainPage()
    {
        InitializeComponent();

        button.Clicked += Button_Clicked;
        ProgressChanged += MainPage_ProgressChanged;
    }

    private void Button_Clicked(object sender, EventArgs e)
    {
        new Thread(() =>
        {
            for (double i = 0; i <= 1; i += .00001)
            {
                ProgressChanged.Invoke(this, i);
            }
        }).Start();
    }

    private void MainPage_ProgressChanged(object sender, double e)
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            progressBar.Progress = e;
        });
    }
}

1 个答案:

答案 0 :(得分:6)

假设 设备上的屏幕刷新率为16.6毫秒,您将以快速的形式向UI /主线程发送100,000条消息for循环可以在后台线程上执行。

现在UI必须处理这些消息,(16.6ms * 100,000)/ 1000 ms / sec,并且您有27分钟的更新。这不是一件实事。