问题标签 [invokerequired]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
6320 浏览

winforms - 在不存在控制对象的情况下在 UI 线程上运行代码

我目前正在尝试编写一个组件,它的某些部分应该在 UI 线程上运行(解释会很长)。因此,最简单的方法是将控件传递给它,并在其上使用 InvokeRequired/Invoke。但我认为将控件引用传递给“数据/背景”组件不是一个好的设计,所以我正在寻找一种在 UI 线程上运行代码而不需要可用控件的方法. WPF中的Application.Dispatcher.Invoke之类的...

任何想法,谢谢马丁

0 投票
6 回答
7472 浏览

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

我已经看到了对 GUI 控件的跨线程访问的常见设置,例如这里讨论的: Shorest way to write a thread-safe access method to a windows forms control

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

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

我认为答案是否定的,所以我真正的问题是“为什么”?

0 投票
2 回答
482 浏览

c# - 查找需要 InvokeRequired 的方法

我来找你看看是否有人知道如何解决我在迁移到 ActiveMQ 时遇到的问题。我正在使用 ActiveMQ 在这个项目中发送通知(在 C# 中),在完成实现后,我发现了一些关于线程问题的错误。(我知道该异常的解决方案是使用“if this.InvokeRequired.... etc”,但我的问题是:

有没有办法找到所有需要这个调用的方法?

当然,我可以逐步检查通知触发的所有事件,但是,除了这会花费我太多时间之外,它不会解决我未来的编程错误。

我想有更好的方法来解决这个问题,但我现在想不出。你以前遇到过这个问题吗?

非常感谢您的帮助

0 投票
2 回答
378 浏览

vb.net - Control.Invoke 从不调用委托

我正在使用 DevExpress XtraGrid 控件。

我有一个例程通过并动态添加当前表单上的所有控件,并在单独的线程上启动给定控件的例程以将其初始化为将显示给最终用户的值。一些控件正在显示计算值,并且需要一些时间来返回它们的值,所以这就是我们在单独的线程上执行它的原因。

除了在特定情况下的 DevExpress XtraGrid 控件外,一切都按预期工作。

我正在为任何必须更新的控件属性使用类似的代码片段,并且一切正常。在上面的代码中,当调用实际的 Invoke 时,似乎线程刚刚结束并且从不调用委托,并且也没有返回完成。

有人对可能导致这种奇怪行为的原因有任何想法吗?

0 投票
3 回答
1110 浏览

c# - InvokeRequired 属性的值何时更改?

当我想在 Windows 窗体工作时使用委托类进行调用时,我总是必须使用 InvokeRequired。没关系。但是谁在 InvokeReuqired 属性工作时更改了它。请检查此图像: 替代文字

0 投票
3 回答
399 浏览

c# - .NET 中的事件和多线程代码

项目是 C#。

所以我有一堆设计为作为库运行的多线程代码。它与 UI 位于一个单独的项目中。

我的库有一个中心对象,需要在创建任何会触发事件的东西之前创建它。

这个主对象是否可以在某些对象中传递,以便我的事件可以确定何时需要调用它们以返回主 UI 线程?

我真的很想让 UI 不必进行大量调用,因为他的事件处理程序几乎总是会从某个随机后台线程中调用。

0 投票
4 回答
2892 浏览

c# - UI线程中异步组件的触发事件

我正在.Net 2.0 中构建一个非可视组件。该组件使用异步套接字(BeginReceive、EndReceive 等)。在运行时创建的工作线程的上下文中调用异步回调。组件用户不必担心多线程(这是主要目标,我想要的)

组件用户可以在任何线程中创建我的非可视组件(UI 线程只是简单应用程序的公共线程。更严重的应用程序可以在任意工作线程中创建组件)。组件触发事件,例如“SessionConnected”或“DataAvailable”。

问题:由于异步回调和其中引发的事件,事件处理程序在工作线程上下文中执行。我想使用一个中间层来强制事件处理程序在首先创建组件的线程的上下文中执行。

示例代码(从异常处理等中剥离...)

由于异步套接字的性质,所有使用我的组件的应用程序都充斥着“If (this.InvokeRequired) { ...”,我想要的只是用户能够无忧无虑地使用我的组件作为一种下降-在。

那么我将如何在不要求用户检查 InvokeRequired 的情况下引发事件(或者,换句话说,我如何强制在与最初启动事件的线程相同的线程中引发事件)?

我已经阅读了有关 AsyncOperation、BackgroundWorkers、SynchronizingObjects、AsyncCallbacks 和大量其他内容的内容,但这一切都让我头晕目眩。

我确实想出了这个,当然是笨拙的“解决方案”,但在某些情况下它似乎失败了(例如,当我的组件通过静态类从 WinForms 项目中调用时)

任何帮助,将不胜感激。提前致谢!

编辑:根据这个线程,我最好的选择是使用 SynrhonizationContext.Post 但我看不到如何将它应用于我的情况。

0 投票
9 回答
157908 浏览

c# - 自动化 InvokeRequired 代码模式

我已经痛苦地意识到需要在事件驱动的 GUI 代码中编写以下代码模式的频率,其中

变成:

这是 C# 中的一个尴尬模式,无论是记忆还是打字。有没有人想出某种捷径或结构来在一定程度上实现自动化?如果有一种方法可以将函数附加到执行此检查的对象而无需完成所有这些额外工作,例如object1.InvokeIfNecessary.visible = true类型快捷方式,那就太酷了。

以前的答案已经讨论了每次只调用 Invoke() 的不切实际,即使这样 Invoke() 语法既低效又难以处理。

那么,有没有人想出捷径呢?

0 投票
1 回答
1115 浏览

winforms - 在没有 InvokeRequired 的多线程场景中,Winforms 数据绑定到业务对象?

例如,我有一个业务对象Person

而且我有一些 Winforms UI 控件数据绑定到此类的对象:

现在我正在进行更改,somePerson并且由于已经INotifyPropertyChanged实施,这些更改会反映在 UI 中。到现在为止还挺好。

现在我的问题:如果我在工作线程中进行更改somePerson(即不在 UI 线程中),例如因为我正在从数据库加载数据作为后台操作,这可能会导致异常,因为数据绑定尝试更新控件,仅允许在 UI 线程上发生。

这意味着我需要调用InvokeRequiredUI 元素来查看是否允许我更新业务对象——这似乎违反了应用程序的逻辑分层

理想情况下,我希望能够修改我的业务对象,而不必关心它是否与 UI 数据绑定。这是否可以通过 Winforms 数据绑定实现?

0 投票
3 回答
2722 浏览

c# - 在 PictureBox 上 InvokeRequired 为真。如何处理?

我的 PictureBox 电话中有另一个问题,给了我 3 种错误,特别是来自Conrad Frix的一些很好的答案。所以它让我弄清楚我的问题出在哪里,但现在要解决它我不是 100% 确定的。

基本上我有一个 Windows 窗体计时器,它正在检查某个事件是否为真,如果是,那么它会告诉系统在所述事件(一个值)超过某个阈值后 2 秒发送一些数据。

我认为我拥有的所有计时器都在用我的 PictureBox 创建一个令人讨厌的竞争条件,我在几个地方使用它来获取图像:

ETC...

我在某处读到计时器的间隔应该至少为 50。从 33 开始设置。我发现我可以做一个 picCapture.InvokeRequired 来看看它是否会基本上死掉。我知道我需要使用一个委托,但只使用它们来设置一些东西......而不是从中获取图像......不知道如何设置它......我知道确实是什么原因造成的,就是这个代码组合:

根据我之前的问题,在 timer1_tick 事件中似乎不再出现内存问题或其他错误......(内存不足错误是一个)。

我认为最大的问题是当我需要它的图像数据时如何处理 picCapture.InvokeRequired ?我确定它在 timer1_click 中的线程计时器调用导致了这个....