在Winform中用BackgroundWorker来异步更新UI

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

本文大部分内容参照了: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更新。

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