C# - 如何从 InvokeRequired 模式获取同步 UI 更新?

发布于 2024-11-07 02:31:54 字数 164 浏览 6 评论 0原文

我有许多线程将文本附加到富文本框。 使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不即不离 2024-11-14 02:31:54

您无法在不接触 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 than Invoke; the only difference is that Invoke 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文