调用Control.Invoke()
时,它会阻止调用线程,直到消息得到处理。我想知道我是否可以从另一个线程中脱离这个块。
注意:我知道我可以使用Control.BeginInvoke()
,但我不是在问这个问题。
答案 0 :(得分:3)
不,你不能。
等待线程决定唤醒它的条件集。
如果您想要中断跨线程通话选项,可以使用ManualResetEvent
,来自WaitHandle
的{{1}}和BeginInvoke
。
请注意,如果执行此操作然后使用事件从等待中唤醒,则不会使跨线程调用出列。工作线程不再等待它了。
答案 1 :(得分:0)
...如果我可以从另一个线程中突破这个块
Control.Invoke()
将在作为主线程的UI线程上运行。如果你杀了它,你将退出该应用程序。
为防止UI线程阻塞太长时间,您应该只在Control.Invoke()
中执行仅更新控件的操作。其他任何事都应该在其他地方完成。