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

为什么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.通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生

    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?