不管 InvokeRequired 调用 Invoke 有什么问题?

What#39;s wrong with calling Invoke, regardless of InvokeRequired?(不管 InvokeRequired 调用 Invoke 有什么问题?)
本文介绍了不管 InvokeRequired 调用 Invoke 有什么问题?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经看到了对 GUI 控件进行跨线程访问的常见设置,如下所述:最短的写法对 Windows 窗体控件的线程安全访问方法

I've seen the common setup for cross threading access to a GUI control, such as discussed here: Shortest way to write a thread-safe access method to a windows forms control

我发现的所有网络点击都描述了类似的事情.

All the web hits I found describe a similar thing.

但是,为什么我们需要检查 InvokeRequired?我们不能直接调用 Invoke 吗?

However, why do we need to check InvokeRequired? Can't we just call Invoke directly?

我假设答案是否定的,所以我真正的问题是为什么"?

I assume the answer is no, so my real question is 'why'?

推荐答案

从非 UI 线程我们无法触摸 UI - 可能会发生非常糟糕的事情,因为控件具有线程关联性.因此,我们必须(至少)从非 UI 线程调用 InvokeBeginInvoke.

From non-UI threads we can't touch the UI - very bad things can happen, since controls have thread affinity. So from a non-UI thread we must (at a minumum) call Invoke or BeginInvoke.

然而,对于 UI 线程 - 我们想要调用 Invoke 很多时间;问题是,如果您已经在 UI 线程上,它仍然有向表单的泵发送消息并进行处理的不必要开销.

For UI-threads, however - we don't want to call Invoke lots of time; the issue is that if you are already on the UI thread, it still has the unnecessary overhead of sending a message to the form's pump and processing it.

实际上,在您知道的大多数线程代码中,您希望在 -UI 线程上调用特定方法,因此在这些情况下,不需要额外的开销:只需调用 Invoke.

In reality, in most threading code you know you expect a specific method to be called on a non-UI thread, so in those cases, there is no additional overhead: just call Invoke.

这篇关于不管 InvokeRequired 调用 Invoke 有什么问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)