.net多线程程序windows窗体安全调…

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

访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能会出现其他与线程相关的 Bug,例如争用情况和死锁。确保以线程安全方式访问控件非常重要。

.NET Framework 可帮助您检测以非线程安全方式访问控件这一问题。InvalidOperationException with the message, "Control control name accessed from a thread other than the thread it was created on."" data-guid="65b04c7d12ecae567f6f7fdf91b9a001">在调试器中运行应用程序时,如果一个不是创建某个控件的线程的其他线程调用该控件,则调试器会引发一个 InvalidOperationException,并显示以下消息:“从不是创建控件控件名称 的线程访问它。”

此异常在调试期间和运行时的某些情况下可靠地发生。在调试以 .NET Framework 2.0之前的 .NET Framework 编写的应用程序时,可能会出现此异常。CheckForIllegalCrossThreadCalls property to false." data-guid="1c4ff81dae19933648c8ef80682c7d61">我们强烈建议您在发现此问题时进行修复,但您可以通过将 CheckForIllegalCrossThreadCalls 属性设置为 false 来禁用它。这会使控件像在 Visual Studio .NET 2003 和 .NET Framework 1.1 中一样运行。在未使用 Invoke 方法的情况下,从不是创建某个控件的线程的其他线程调用该控件是不安全的。

------------------------------------------下面才是安全调用方式----------------------------------

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


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

  1. InvokeRequired property." data-guid="9796383d82cfbcc824efb5a0235272e9">查询控件的 InvokeRequired 属性。

  2. InvokeRequired returns true, call Invoke with a delegate that makes the actual call to the control." data-guid="e4c9267f608ffcc3011b7f39ce0148d6">如果 InvokeRequired 返回 true,则使用实际调用控件的委托来调用 Invoke。

  3. InvokeRequired returns false, call the control directly." data-guid="9e810d8012c1a941754f00b819efdfa3">如果 InvokeRequired 返回 false,则直接调用控件。

ThreadProcSafe method, which is executed by the background thread." data-guid="b22333bf40417ea55e419e79cfb36102">在下面的代码示例中,将在由后台线程执行的 ThreadProcSafe 方法中实现线程安全调用。TextBox control's InvokeRequired returns true, the ThreadProcSafe method creates an instance of SetTextCallback and passes that to the form's Invoke method." data-guid="b4a05c0a9cd605de7fe0298c7caedff6">如果 TextBox 控件的 InvokeRequired 返回 true,则 ThreadProcSafe 方法会创建 SetTextCallback 的一个实例,并将该实例传递给窗体的 Invoke 方法。SetText method to be called on the thread that created the TextBox control, and in this thread context the Text property is set directly." data-guid="05532b762b11591815a13da83867acb0">这使得 SetText 方法被创建 TextBox 控件的线程调用,而且在此线程上下文中将直接设置 Text 属性。

" data-guid="6e683baf160ddcc3a11e49c3 5a3d7ce1">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值