问题标签 [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.
c# - 从 Threadpool 访问 WebBrowser
我正在尝试从另一个线程访问网络浏览器上的信息。尝试访问时browser.DocumentTitle
,我收到此错误:
The name DocumentTitle does not exist in the current context
我可以成功导航到DoWork
orProcessWebPage
方法中的网页,但我无法在GetTitle
不崩溃的情况下访问该功能。几天来,我一直在独自研究这一部分,根本无法弄清楚。
这是问题代码:
浏览器代码
其他线程
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”的隐式引用转换。
我知道这可能是一个简单的修复,但我可以处理它:/
vb.net - 进度条和代码位置的多线程(vb.net)?
我被困在从不同的线程更新进度条。我确实让它以最简单的方式运行,但随后清理代码让我陷入困境。
我的测试代码看起来像网络上所有与 backgroundworker 和 BeginInvoke 相关的示例。
FormP 是 Progressbar-Form。这有效:
如果我试图让事情更有序地封装在 FormP 中,那就行不通了。
FormP 不会冻结,但 UI 不会更新。实际上 Me.InvokeRequired 是错误的,我认为这就是我开始错过一些重要部分的地方。我在这里尝试了 Form1.InvokeRequired,但它也是错误的。我的理解是:这里的调用线程就是bgw线程,不管这个线程调用的是什么类的代码……好像不是这样的吧?
感谢您的任何想法。
silverlight - 在silverlight中调用Required?
SilverLight 中是否有与Control.InvokeRequired
Winforms 相同的东西?
我已经发现 Winforms Invoke 相当于Control.Dispatcher.BeginInvoke
但我找不到类似的东西InvokeRequired
vb.net - VB - 如何从在另一个线程(串行对象)上运行的类中访问数据
我正在编写一个名为 Field 的类,它使用串行对象从 Arduino 获取一些值。我有一个由类引发的事件(当从串行端口接收到数据时,或多或少),当发生这种情况时,我需要从这个类中检索数据。下面的代码有效,但似乎没有按照我需要的方式这样做。我对线程如何工作的了解很少,我只知道串行端口对象在它自己的线程中运行,这使得使用它变得非常痛苦。
有没有一种方法可以轻松访问在另一个线程中运行的数据,而不涉及这些“InvokeRequired”If-Then 条件?有关在这种情况下线程如何工作的更多信息也很棒。
c# - 不需要另一个调用(+后台工作人员)
我在堆栈溢出上搜索了调用所需的相关帖子的高低..它帮助我学到了很多..但我有几个问题..不仅与调用所需有关,还与后台工作人员有关..请多多包涵.. :)
我的应用程序做了一些很长的事情,需要在进程中更新 gui(进度条、状态栏、文本框)。我使用了一个线程,但是在更新 UI 时它给出了可怕的跨线程异常。我最近(有点)掌握了正确使用invokerequired的窍门..[自动化InvokeRequired代码模式]..我在这篇文章中使用的代码是:
现在这是我注意到的事情.. this.InvokeIfRequired 和 button1.InvokeIfRequired 都做同样的事情.. 为什么会这样?我期待 button1.InvokeIfRequired 中的 Text 对应于 button1 的 text 属性.. 但它指的是父表单的.. 对我来说这似乎很愚蠢、不直观和错误.. 或者我做错了什么..
另一个问题..当时我没有掌握invokerequired的窍门,所以我求助于使用后台工作者..并使用进度事件来更新gui..
到目前为止,它还没有给我带来问题..我想知道这两种方法中哪一种更好?为什么?另外,有没有办法将数据传递给之前的 InvokeIfRequired 函数?
谢谢.. =)
编辑 01:对父窗体或目标控件使用 Invoke 有什么区别吗?.. 是的 form.invoke 和 control.invoke 是一样的.. 但为什么会这样呢?它不直观,并给人以错误的印象..
c# - 从多个后台线程更新标签
我正在开发一个足球模拟器,我在不同的线程上有 9 场比赛的背景。在每个线程核心的方法中,都有一个事件。当这种情况发生时(当一个目标被“踢”时),我想用部分结果更新表单上的一个标签(名为goalLabel)。我写了一个代码...:
...在每场比赛中,目标的确切数量将是 6(结果将是 3 - 3),因此对于 9(9 也是固定的)背景匹配,goalLabel 应该更改文本(6 * 9 =) 54 次。然而,它只改变了几次。这是事件的事件处理程序方法:
和 UpdateGoalLabel 方法:
所以我可以到达并更改标签的文本,但我不知道为什么它不更改 54 次。这就是目标,在每个目标之后得到通知。
任何的想法?
先感谢您。
更新 #1:我正在使用 VS2010。
这是我启动线程的代码:
更新#2:这是我附加事件处理程序的地方(这是在相同的方法中,在前一个代码块上方几行):
我将这些 Team 数组转换为 Match 对象,因为这个类有两个 Team 字段,并且有事件和 PlayMatch 方法,该方法仍然是包含(仅)第一个代码块的方法。
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 更改按预期工作。
invokerequired - InvokeRequired=true 在主线程上?
我正在调试一个 WinForm 控件,它返回 InvokeRequired = true 尽管我在主线程上。控件是否有可能成为非 UI 线程的子级?我认为作为 UI 组件的控件只能是 UI 线程的子级。
c# - InvokeRequired 和 BeginInvoke 等效项
我在我的 Windows 窗体中有这个功能,现在我正在尝试将我的工作转移到 WPF,转移后我注意到InvokeRequired
并且BeginInvoke
WPF 不支持。我正在寻找将我的函数转换为 WPF 的正确方法:
这是我的主课中的线程循环: