winform中多线程给控件赋值问题

Task.Run(() =>
            {
                for (var i = 1; i <= 100000; i++)
                {
                    //Thread.Sleep(1);
                    int number = i;
                    this.BeginInvoke(new Action<int>(x =>
                    {
                        this.label2.Text = x.ToString();
                    }), number);
                }
            });

点击按钮,调用这个异步多线程代码段,给窗体的lable赋值,注释掉Thread.sleep ,界面就会卡死,直到循环后最终结果再赋值,跟同步差不多。不注释就正常!

请问这是什么情况,应该怎么调整!不想使用thread.sleep解决这个问题!

WinForm 窗口控件是不允许在非UI线程修改其内容的,因此需要使用 Control.BeginInvoke() 或 Control.Invoke() 将修改请求委托到UI线程上执行。

但是,使用 BeginInvoke() 方法来给标签赋值,每次都会把修改请求加入UI线程的消息队列,导致队列积压。如果加上了 Thread.Sleep(1),消息队列得到解压,页面就不会卡死。

推荐使用一种更加优秀的解决方案:使用异步方式给标签赋值,并且不使用 Thread.Sleep()。使用异步方式能够减少消息队列积压的问题。