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

use*_*234 0 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;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

Sus*_*ver 6

假设设备上的屏幕刷新率为16.6毫秒,那么就像在循环可以在后台线程上执行的那样快速地向UI /主线程发送100,000条消息for.

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

  • @ user875234这只是在主/线程上调用动作/消息的纯粹开销,您已经"捕获"了在线程中使用时通过堆栈保留的值实例.这样的旋转式紧凑循环(在任何操作系统上)都不是一件实事. (2认同)