2011-05-16 40 views
-1

我有一些线程将文本追加到一个富文本框。 使用Invoke(),我很容易在主UI线程和工作线程之间发生死锁。 使用BeginInvoke(),我得到了我不想要的异步UI更新。我希望文本立即出现在文本框中,而不是在我无法确定的后期阶段。C# - 如何从InvokeRequired模式获取同步UI更新?

我该如何完成我的任务?

谢谢!

+0

你似乎误解了我以前的答案。 – SLaks 2011-05-16 03:11:25

回答

3

您不能在不接触UI线程的情况下奇迹般地在UI线程上运行。
如果你想调用Invoke,你需要让UI线程停止等待后台线程。

但是,您应该拨打BeginInvoke来代替。
BeginInvoke并不比Invoke小;唯一的区别是Invoke强制调用线程等待,直到UI线程有机会运行委托。

如果后台线程需要等待UI线程运行委托(例如,如果它返回一个值),则可以调用Invoke
在正常情况下,您应该始终致电BeginInvoke;在后台线程等待UI线程空闲时通常没有意义。

+0

非常感谢你SLaks。现在,我已经用线程挣扎了两天,大致了解了事情的工作原理。 – Charlie 2011-05-18 08:27:39