我有一些线程将文本追加到一个富文本框。 使用Invoke(),我很容易在主UI线程和工作线程之间发生死锁。 使用BeginInvoke(),我得到了我不想要的异步UI更新。我希望文本立即出现在文本框中,而不是在我无法确定的后期阶段。C# - 如何从InvokeRequired模式获取同步UI更新?
我该如何完成我的任务?
谢谢!
我有一些线程将文本追加到一个富文本框。 使用Invoke(),我很容易在主UI线程和工作线程之间发生死锁。 使用BeginInvoke(),我得到了我不想要的异步UI更新。我希望文本立即出现在文本框中,而不是在我无法确定的后期阶段。C# - 如何从InvokeRequired模式获取同步UI更新?
我该如何完成我的任务?
谢谢!
您不能在不接触UI线程的情况下奇迹般地在UI线程上运行。
如果你想调用Invoke
,你需要让UI线程停止等待后台线程。
但是,您应该拨打BeginInvoke
来代替。
BeginInvoke
并不比Invoke
小;唯一的区别是Invoke
强制调用线程等待,直到UI线程有机会运行委托。
如果后台线程需要等待UI线程运行委托(例如,如果它返回一个值),则可以调用Invoke
。
在正常情况下,您应该始终致电BeginInvoke
;在后台线程等待UI线程空闲时通常没有意义。
非常感谢你SLaks。现在,我已经用线程挣扎了两天,大致了解了事情的工作原理。 – Charlie 2011-05-18 08:27:39
你似乎误解了我以前的答案。 – SLaks 2011-05-16 03:11:25