fox123871 2021-10-13 10:36 采纳率: 0%
浏览 59

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解决这个问题!

  • 写回答

1条回答 默认 最新

  • 流比 2023-01-30 17:32
    关注

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

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

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

    评论

报告相同问题?

问题事件

  • 创建了问题 10月13日

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘