在Winform中用BackgroundWorker来异步更新UI

嘎子 C# 2016-02-01 718 次浏览 , 没有评论

本文大部分内容参照了:http://www.tuicool.com/articles/FNzURb

C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常。处理跨线程更新Winform UI控件常用的方法有4种: 

1. 通过UI线程的SynchronizationContext的Post/Send方法更新;

2. 通过UI控件的Invoke/BegainInvoke方法更新;

3. 通过BackgroundWorker取代Thread执行异步操作;

4. 通过设置窗体属性,取消线程安全检查来避免”跨线程操作异常”(非线程安全,建议不使用)。 

其他三种方法我个人也不是很了解,但对于Winform来说,第三种方法是非常不错的选择。

BackgroundWorker是EAP(Event based Asynchronous Pattern)思想的产物,DoWork用来执行异步任务,在任务执行过程中/执行完成后,我们可以通过ProgressChanged,ProgressCompleteded事件进行线程安全的UI更新。

方法的用法,此方法共分三步:

注意:
backgroundWorker1.WorkerReportsProgress = true;如果不进行此设置,backgroundWorker1不会报告进度。

注意:BackGroundWorker在System.ComponentModel命名空间内。

原创文章,转载请注明: 转载自TsonTec:测量解决方案提供者

本文链接地址: 在Winform中用BackgroundWorker来异步更新UI

相关主题

  • C#正则表达式的零宽断言2016-06-17 C#正则表达式的零宽断言 (0)
    我写文章的一个最基本的想法就是只写可以解决问题的部分,这样能很快的解决一个问题,而不探讨这项技术中的复杂的技术细节,这样有好处也有坏处。好处是我写的文章都简单 […]
  • 从Visual Studio for Mac再议微软的野心2016-12-10 从Visual Studio for Mac再议微软的野心 (0)
    之前写过一篇文章:从.Net Core的发布粗谈微软的野心,今天我也不知道自己怎么想的,又去了Visual […]
  • C#重载操作符==和!=时注意问题2016-03-12 C#重载操作符==和!=时注意问题 (0)
    1、大家一定要明确一点就是如果两个类在没有重载==和!=时用这两个运算符进行比较,那么只有引用相同的地方的时候才返回true,否则(不管里面的内容是否相等)返 […]
  • C#中几种比较是否相等的方法(Equals,ReferenceEquals,==)2016-12-04 C#中几种比较是否相等的方法(Equals,ReferenceEquals,==) (0)
    这个文章是之前遇到的一个问题,自己就记录在案了,现在分享出来给大家,当然这里面的内容在很多地方也能找到,并非常所有的东西都是原创,但我会尽量的把问题说的非常明 […]
  • C#中的具名参数、可选参数及注意问题2016-03-21 C#中的具名参数、可选参数及注意问题 (0)
    具名参数 和 可选参数 是 C# framework 4.0 出来的新特性。 一. 常规方法定义及调用 public void […]
  • C#正则表达式的应用2016-03-06 C#正则表达式的应用 (0)
    自己正则表达式的基础看过很多了,但总是记不住,就将C#使用正则表达式的最常用的东西自己整理一下,以后直接到自己的博客上找非常方便。也希望能帮到有和我一样 […]

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz
回顶部