禁用'CheckForIllegalCrossThreadCalls'是阻止交叉线程错误的好方法吗?

时间:2012-03-21 10:24:04

标签: c# multithreading winforms

我的C#应用​​程序中运行了许多线程,每个线程都访问TextBox来记录其事件。当我将CheckForIllegalCrossThreadCalls属性设置为false时,我可以阻止许多跨线程错误:

System.InvalidOperationException: Cross-thread operation not valid: Control 'myTextBox'
accessed from a thread other than the thread it was created on.

这个问题的最佳解决方案是什么?正如我所尝试的那样使用代理或禁用CheckForIllegalCrossThreadCalls?许多文章都说禁用CheckForIllegalCrossThreadCalls并不是一个好的编程实践。

2 个答案:

答案 0 :(得分:11)

禁用CheckForIllegalCrossThreadCalls就像抱怨你撞车时被安全气囊撞到:正确的解决办法不是取下安全气囊,而是为了避免撞坏汽车。

您根本不应该从错误的线程进行UI更新。你可能大部分时间都没有使用它(已经禁用了支票),但这并不意味着这是一个好主意 - 它让你容易接受只会偶尔出现的微妙错误真的很难追查。

所以是的,使用Control.InvokeDispatcher.InvokeBackgroundWorker等来编组到正确的线程进行UI访问。这就是为什么这些电话/类型存在的原因。

答案 1 :(得分:0)

answer对不同的问题有答案。 最简洁的答案是不。 切换到BackgroundWorkers。