C# - 如何从 InvokeRequired 模式获取同步 UI 更新?
我有许多线程将文本附加到富文本框。 使用 Invoke(),我很容易在主 UI 线程和工作线程之间陷入死锁。 使用 BeginInvoke(),我得到了异步 UI 更新,这是我不想要的。我希望文本立即出现在文本框中,而不是在我无法确定的后期阶段出现。
我该如何完成我的任务?
谢谢!
I have a number of threads to append text to a rich text box.
With Invoke(), I very easily get deadlock between the main UI thread and the worker threads.
With BeginInvoke(), I get async UI update, which I do not want. I want the texts appear in the text box instantly, not at some later stage that I can't determine.
How do I do my task?
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您无法在不接触 UI 线程的情况下神奇地在 UI 线程上运行。
如果你想调用
Invoke
,你需要让UI线程停止等待后台线程。但是,您应该只调用
BeginInvoke
。BeginInvoke
并不比Invoke
更即时;唯一的区别是Invoke
强制调用线程等待,直到 UI 线程有机会运行委托。如果后台线程需要等待 UI 线程运行委托(例如,如果它返回一个值),您将调用
Invoke
。在正常情况下,您应该始终调用
BeginInvoke
;通常,让后台线程等待 UI 线程空闲是没有意义的。You cannot magically run on the UI thread without touching the UI thread.
If you want to call
Invoke
, you need to make the UI thread stop waiting for the background threads.However, you should just call
BeginInvoke
instead.BeginInvoke
isn't any less instant thanInvoke
; the only difference is thatInvoke
forces the calling thread to wait until the UI thread has a chance to run the delegate.You would call
Invoke
if the background thread needs to wait for the UI thread to run the delegate (eg, if it returns a value).In normal cases, you should always call
BeginInvoke
; there's usually no point in making the background thread wait until the UI thread is free.