时间:2016-11-3来源:本站原创作者:佚名

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

如果使用多线程处理来提高Windows窗体应用程序的性能,则你必须确保以线程安全的方式调用控件。

访问Windows窗体控件不是本身就线程安全的。如果有两个或两个以上线程操作控件的状态,则可能迫使该控件处于不一致状态。可能出现其他与线程相关的bug,例如争用条件和死锁。请务必确保以线程安全的方式访问控件。

1.初学者常常遇到的问题

从未使用Invoke方法创建控件的线程调用控件是不安全的。下面是一个非线程安全的调用示例。运行时会引发InvalidOperationException消息,报错“从并未创建该控件的线程访问该控件控件名称”。

2.解决方法

如需对Windows窗体控件进行线程安全的调用。

①查询控件的InvokeRequired属性。

②若InvokeRequired返回true,则用实际调用控件的委托来调用Invoke。

③若InvokeRequired返回false,则请直接调用控件。

这里分同步执行委托和异步执行委托。

在以下代码示例中,在ThreadProcSafe方法中实现了线程安全的调用,该方法由后台线程执行。若TextBox控件的InvokeRequired返回true,则ThreadProcSafe方法创建一个SetTextCallback实例并将其传递到窗体的Invoke方法。这导致在创建了SetText控件的线程上调用TextBox方法,并且在该线程上下文中直接设置Text属性。

3.BackgroundWorker组件

在应用程序中实现多线程的首选方式是使用BackgroundWorker组件。BackgroundWorker组件为多线程处理使用事件驱动模型。后台线程运行你的DoWork事件处理程序,创建了你的控件的线程运行ProgressChanged和RunWorkerCompleted事件处理程序。你可以从ProgressChanged和RunWorkerCompleted事件处理器中调用控件。

①创建一种方法来进行你想在后台线程中进行的工作。不要调用由此方法中的主线程所创建的控件。

②创建一种方法来报告后台工作结束后的后台工作结果。在此方法中可以调用主线程创建的控件。

③将步骤1中创建的方法绑定到DoWork实例中的BackgroundWorker事件,并将步骤2中创建的方法绑定到同一实例的RunWorkerCompleted事件。

④若要启动后台线程,请调用RunWorkerAsync实例的BackgroundWorker方法。

在以下代码示例中,DoWork事件处理程序使用Sleep来模拟需要花费一些时间的工作。它不会调用该窗体的TextBox控件。TextBox控件的Text属性直接在RunWorkerCompleted事件处理程序中设置。

也可通过使用ProgressChanged事件来报告后台任务的进度。如需包含该事件的示例,请参阅BackgroundWorker。

文章转自CSDN.NET,如有版权问题,请联系删除。









































海口治白癜风最好的医院
白癜风专科哪家好

转载请注明原文网址:http://www.helimiaopu.com/cksc/1261.html
------分隔线----------------------------