问题标签 [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 投票
2 回答
499 浏览

c# - 从 Threadpool 访问 WebBrowser

我正在尝试从另一个线程访问网络浏览器上的信息。尝试访问时browser.DocumentTitle,我收到此错误:

The name DocumentTitle does not exist in the current context

我可以成功导航到DoWorkorProcessWebPage方法中的网页,但我无法在GetTitle不崩溃的情况下访问该功能。几天来,我一直在独自研究这一部分,根本无法弄清楚。

这是问题代码:

浏览器代码

其他线程

0 投票
3 回答
8942 浏览

c# - InvokeRequired 和 ToolStripStatusLabel

在我的应用程序中,我有一个负责所有数据库操作的类。它从主类调用,并在操作完成后使用委托调用方法。因为它是异步的,所以我必须在我的 GUI 上使用调用,所以我创建了一个简单的扩展方法:

当我尝试在 textBox 上调用它时,这很好用:

但是当我尝试在 ToolStripStatusLabel 或 ToolStripProgressBar 上调用它时,出现错误:

类型“System.Windows.Forms.ToolStripStatusLabel”不能用作泛型类型或方法“SimpleApp.Helpers.InvokeIfRequired(T, System.Action)”中的类型参数“T”。没有从“System.Windows.Forms.ToolStripStatusLabel”到“System.Windows.Forms.Control”的隐式引用转换。

我知道这可能是一个简单的修复,但我可以处理它:/

0 投票
1 回答
10457 浏览

vb.net - 进度条和代码位置的多线程(vb.net)?

我被困在从不同的线程更新进度条。我确实让它以最简单的方式运行,但随后清理代码让我陷入困境。

我的测试代码看起来像网络上所有与 backgroundworker 和 BeginInvoke 相关的示例。

FormP 是 Progressbar-Form。这有效:

如果我试图让事情更有序地封装在 FormP 中,那就行不通了。

FormP 不会冻结,但 UI 不会更新。实际上 Me.InvokeRequired 是错误的,我认为这就是我开始错过一些重要部分的地方。我在这里尝试了 Form1.InvokeRequired,但它也是错误的。我的理解是:这里的调用线程就是bgw线程,不管这个线程调用的是什么类的代码……好像不是这样的吧?

感谢您的任何想法。

0 投票
1 回答
603 浏览

silverlight - 在silverlight中调用Required?

SilverLight 中是否有与Control.InvokeRequiredWinforms 相同的东西?

我已经发现 Winforms Invoke 相当于Control.Dispatcher.BeginInvoke但我找不到类似的东西InvokeRequired

0 投票
1 回答
411 浏览

vb.net - VB - 如何从在另一个线程(串行对象)上运行的类中访问数据

我正在编写一个名为 Field 的类,它使用串行对象从 Arduino 获取一些值。我有一个由类引发的事件(当从串行端口接收到数据时,或多或少),当发生这种情况时,我需要从这个类中检索数据。下面的代码有效,但似乎没有按照我需要的方式这样做。我对线程如何工作的了解很少,我只知道串行端口对象在它自己的线程中运行,这使得使用它变得非常痛苦。

有没有一种方法可以轻松访问在另一个线程中运行的数据,而不涉及这些“InvokeRequired”If-Then 条件?有关在这种情况下线程如何工作的更多信息也很棒。

0 投票
1 回答
1140 浏览

c# - 不需要另一个调用(+后台工作人员)

我在堆栈溢出上搜索了调用所需的相关帖子的高低..它帮助我学到了很多..但我有几个问题..不仅与调用所需有关,还与后台工作人员有关..请多多包涵.. :)

我的应用程序做了一些很长的事情,需要在进程中更新 gui(进度条、状态栏、文本框)。我使用了一个线程,但是在更新 UI 时它给出了可怕的跨线程异常。我最近(有点)掌握了正确使用invokerequired的窍门..[自动化InvokeRequired代码模式]..我在这篇文章中使用的代码是:

现在这是我注意到的事情.. this.InvokeIfRequired 和 button1.InvokeIfRequired 都做同样的事情.. 为什么会这样?我期待 button1.InvokeIfRequired 中的 Text 对应于 button1 的 text 属性.. 但它指的是父表单的.. 对我来说这似乎很愚蠢、不直观和错误.. 或者我做错了什么..


另一个问题..当时我没有掌握invokerequired的窍门,所以我求助于使用后台工作者..并使用进度事件来更新gui..

到目前为止,它还没有给我带来问题..我想知道这两种方法中哪一种更好?为什么?另外,有没有办法将数据传递给之前的 InvokeIfRequired 函数?

谢谢.. =)


编辑 01:对父窗体或目标控件使用 Invoke 有什么区别吗?.. 是的 form.invoke 和 control.invoke 是一样的.. 但为什么会这样呢?它不直观,并给人以错误的印象..

0 投票
2 回答
369 浏览

c# - 从多个后台线程更新标签

我正在开发一个足球模拟器,我在不同的线程上有 9 场比赛的背景。在每个线程核心的方法中,都有一个事件。当这种情况发生时(当一个目标被“踢”时),我想用部分结果更新表单上的一个标签(名为goalLabel)。我写了一个代码...:

...在每场比赛中,目标的确切数量将是 6(结果将是 3 - 3),因此对于 9(9 也是固定的)背景匹配,goalLabel 应该更改文本(6 * 9 =) 54 次。然而,它只改变了几次。这是事件的事件处理程序方法:

和 UpdateGoalLabel 方法:

所以我可以到达并更改标签的文本,但我不知道为什么它不更改 54 次。这就是目标,在每个目标之后得到通知。

任何的想法?

先感谢您。

更新 #1:我正在使用 VS2010。

这是我启动线程的代码:

更新#2:这是我附加事件处理程序的地方(这是在相同的方法中,在前一个代码块上方几行):

我将这些 Team 数组转换为 Match 对象,因为这个类有两个 Team 字段,并且有事件和 PlayMatch 方法,该方法仍然是包含(仅)第一个代码块的方法。

0 投票
1 回答
946 浏览

vb.net - 为什么跨线程调用或调用方法时会创建 MainForm 的值副本?

更新:我认为这与 MainForm 的窗口句柄的延迟实例化有关 - 但无法弄清楚这将如何导致此处看到的行为。

应用程序通过第 3 方 COM 接口请求数据,提供回调以处理结果。在回调中,需要更新 UI - 但更新没有按预期工作。就好像 MainForm 的值副本已创建,何时MainForm.DataReady直接跨线程调用或调用,但 UI 更新在从事件处理程序执行时按预期工作。你能解释一下为什么吗?

(注意:AppDomain.CurrentDomain.Id总是1在 MainForm 或 ClassB 中检查。)

初始代码- 从 ClassB 实例调用 DataReady,而 MainForm 中没有 InvokeRequred /Delegate /Invoke 逻辑。应用程序 UI 更改按预期工作,MainFormSomeListControl.EmptyListMsg = "Not Available"更改不会“坚持”(就像应用于 MainForm 的单独副本一样)

向 DataReady 添加了 InvokeRequred 逻辑,仍然直接从 ClassB 调用。InvokeRequired 永远不会为真,应用程序 UI 更改按预期工作,MainFormSomeListControl.EmptyListMsg = "Not Available"更改不会“坚持”(就像应用于 MainForm 的单独副本一样)

MainForm.DataReady直接从 ClassB调用得到异常:“在创建窗口句柄之前,不能对控件调用 Invoke 或 BeginInvoke。” 直到我强制创建窗口句柄。然后它与以前的行为相同,即 InvokeRequired 永远不会为真,应用程序 UI 更改按预期工作,MainFormSomeListControl.EmptyListMsg = "Not Available"更改不会“粘住”(就像应用于 MainForm 的单独副本一样)

从事件处理程序执行ClassA 和 ClassB 中定义的自定义“获取数据”事件。ClassA 监听 ClassB.got_data_event 并引发 ClassA.got_data_event,MainForm 监听 ClassA.got_data_event 并通过调用 DataReady() 来处理它。这有效 - InvokeRequired 为 true,Invoke 已执行,Application UI 和 MainForm UI 更改按预期工作。

0 投票
1 回答
384 浏览

invokerequired - InvokeRequired=true 在主线程上?

我正在调试一个 WinForm 控件,它返回 InvokeRequired = true 尽管我在主线程上。控件是否有可能成为非 UI 线程的子级?我认为作为 UI 组件的控件只能是 UI 线程的子级。

0 投票
2 回答
4954 浏览

c# - InvokeRequired 和 BeginInvoke 等效项

我在我的 Windows 窗体中有这个功能,现在我正在尝试将我的工作转移到 WPF,转移后我注意到InvokeRequired并且BeginInvokeWPF 不支持。我正在寻找将我的函数转换为 WPF 的正确方法:

这是我的主课中的线程循环: