返回首页

大家好,

我的工作别人WinForm应用程序。有失去控制操作的setText,启用可见,AppendText如...现在我想要做一些改进,我想要做一个后台线程。所以,我有两个选择,保持有效的跨线程操作。

1。使用控件的InvokeRequired属性。
2。设置的Control.CheckForIllegalCrossThreadCalls的属性为false。

如果我参加了第一种方式,我有很多工作要做与现有的代码。但最合适的方式。

如果我参加了第二个选项,它会停止所有的异常。但不是最好的方式做。

因此,在你的经验是最合适的选择,我有什么?评论真的很感激。

回答

评论会员:SAKryukov 时间:2012/02/06
都没有有效的选项

第一个是大禁忌。这使事情变得更糟,因为它可以掩盖一个现实问题。应用程序甚至可以运行多次成功后失败,问题的原因是很难找到,几乎是不可能的。

第二个是不是所有的选项。让我们来看看。

这仅仅是允许一个代码选择天气System.Windows.Forms.Control.Invoke或System.Windows.Forms.Control.BeginInvoke的谓词,所以真正的选择是使用调用,而不是InvokeRequired。你不能调用任何有关用户界面形式的非UI线程。你应该总是使用调用。
现在,什么InvokeRequired呢?它具有有限的需要。首先,它不会不管在哪个控件可以调用Invoke或BeginInvoke,它可以是实际上包含任何控制当前正在运行的用户界面有一些UI线程。这个谓词将总是返回true,如果你把它从任何其他线程,如果你把它在同一UI线程,将始终​​返回false。你知道,在大多数情况下,通过设计,无需调用InvokeRequired。只有当你有一些方法,有时可以从相同的用户界面线程,有时从一些其他线程(S)调用,这个调用可能需要

看到我过去的解决方案,在那里我详细解释这一切:]

mdash;的SA
评论会员:lukeer 时间:2012/02/06
选项2只抑制一个警告。线程不断发生,可能发生的一切丑陋的东西。因此选项2实际上是不是一种选择。

所以还是首次。它是唯一一个你有:赖斯
评论会员:游客 时间:2012/02/06
|不知道的细节,只是小心使用后台线程改变UI,您可能一)混淆用户,如果用户改变的东西,然后更改其他的东西,一个按钮启用-这是为用户很难知道变化的影响按钮的启用状态B)如果用户改变的东西,然后改变别的东西,然后一个按钮被激活,他们一下就可以了,第二个变化可能会使有效的按钮了它可以变得非常混乱,很快开始
帕瓦尔Anuja多尔:即使我会建议为2选项1用于
"当控制创建线程以外的线程试图访问该控件的方法或属性之一,它往往会导致不可预知的结果。"

选项​​2你必须给予时间,但实际上将帮助你得到你所要求的