多线程更新界面

多线程更新界面

对 Windows 窗体控件进行线程安全调用

不安全的跨线程调用

直接从未创建控件的线程调用该控件是不安全的.
Visual Studio 调试器通过引发 InvalidOperationException 检测这些不安全线程调用,并显示消息“跨线程操作无效。控件 “” 从创建它的线程以外的线程访问。”在 Visual Studio 调试期间,对于不安全的跨线程调用总是会发生 InvalidOperationException,并且可能在应用运行时发生。 应解决此问题,但也可以通过将 Control.CheckForIllegalCrossThreadCalls 属性设置为 false 来禁用该异常。

安全的跨线程调用

以下代码示例演示了两种从未创建 Windows 窗体控件的线程安全调用该窗体的方法:
System.Windows.Forms.Control.Invoke 方法,它从主线程调用委托以调用控件。
System.ComponentModel.BackgroundWorker 组件,它提供事件驱动模型

System.Windows.Forms.Control.Invoke 方法

            this.progressBar1.Invoke(new Action(() => {
                this.progressBar1.Value = 10;
            }));

BackgroundWorker 组件

实现多线程处理的一种简单方法是使用 System.ComponentModel.BackgroundWorker 组件,该组件使用事件驱动模型。 后台线程运行不与主线程交互的 BackgroundWorker.DoWork 事件。 ==主线程运行 BackgroundWorker.ProgressChanged 和 BackgroundWorker.RunWorkerCompleted 事件处理程序,它们可以调用主线程的控件=。

若要使用 BackgroundWorker 进行线程安全调用,请在后台线程中创建一个方法来完成这项工作,并将其绑定到 DoWork 事件。 在主线程中创建另一个方法来报告后台工作的结果,并将其绑定到 ProgressChanged 或 RunWorkerCompleted 事件。 若要启动后台线程,请调用 BackgroundWorker.RunWorkerAsync.

this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
            // 
            // backgroundWorker1
            // 
this.backgroundWorker1.WorkerReportsProgress = true; //是否报告执行进度
this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged);
this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);

//调用
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
   string stdPath = e.Argument.ToString();   //获取传入参数

   backgroundWorker1.ReportProgress(value); //报告进度,会引发ProgressChanged事件
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   progressBar1.Value = e.ProgressPercentage; //更新进度条
}

//执行完成
 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 {
     this.progressBar1.Value = 100;
 }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值