iCommunications 2019-05-20 17:02 采纳率: 0%
浏览 1467

为什么BackgroundWorker.dowork()可以操作界面控件?

我在主窗口上添加了一个System.Windows.Forms.Timer,定时器每次触发时会创建一个BackgroundWorker,并开始后台操作,在BackgroundWorker.dowork()事件处理程序代码里我引用了主窗口上的状态条标签,为什么没有报错可以执行?

我真是搞不明白啊,有劳懂的人给讲讲呢,真心先谢谢您了!
“tssl航班查询状态”和“tsslOPC服务器状态”就是主窗口上的状态条标签

private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Enabled = false;
            timer1.Interval = 60000;
            btn设置登机桥是否加入航班联动.Enabled = false;
            btn停止航班联动.Enabled = false;
            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += 向OPC服务器中写入命令;
            bw.RunWorkerCompleted += 后台写入完成;
            bw.RunWorkerAsync();
        }

private void 向OPC服务器中写入命令(object sender, DoWorkEventArgs e)
        {
            try
            {
                hbqlsjjh.查询航班全量数据();
                if (登机桥是否航班联动 == true)//登机桥加入了航班联动
                {
                    if (tssl航班查询状态.Text == "  本次航班查询成功")//本次查询成功,根据航班信息写入
                    {
                        for (int i = 0; i < 49; i++)
                        {
                            OPC.写登机桥航班控制点(i, Convert.ToString(登机桥根据航班是否开(i)));
                        }
                    }
                    else if (tssl航班查询状态.Text == "  本次航班查询失败") //本次查询失败,打开所有登机桥的空调
                    {
                        for (int i = 0; i < 49; i++)
                        {
                            OPC.写登机桥航班控制点(i, "1");
                        }
                    }
                }
            }
            catch (Exception err)
            {
                tsslOPC服务器状态.Text = "  与OPC服务器交互失败:" + err.Message;
            }
        }

  • 写回答

1条回答 默认 最新

  • 红鲜森 2019-05-24 09:09
    关注

    1、进程与线程:进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源。
    2、BackgroundWorker就是为了创建一条新的线程
    3、界面是主线程创建的,因此在新的线程无法直接修改界面,但是可以采用委托的方式进行修改,你代码中的“+= 向OPC服务器中写入命令;”就可以看成是一个委托,所以可以操作
    4、主线程边执行边修改界面是不行的,因为主线程的任务没执行完,会有卡死的感觉。而BackgroundWorker就是为了创建一条新的线程可以放在后台去处理,因此主线程上的界面的其他事件可以继续运行。
    多线程的好处:

    1.使用线程可以把占据时间长的程序中的任务放到后台去处理

    2.用户体验更好,这样比如用户点击了一个按钮去触发某件事件的处理,可以弹出一个进度条来显示处理的进度

    3.程序的运行效率可能会提高

    4.在一些等待的任务实现上如用户输入,文件读取和网络收发数据等,线程就比较有用了.

    多线程的缺点:

    1.如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换.

    2.更多的线程需要更多的内存空间

    3.线程中止需要考虑对程序运行的影响.

    4.通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生

    评论

报告相同问题?

悬赏问题

  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊