问题标签 [cross-thread]

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 回答
223 浏览

c# - 等待消息表单中的进度条 - 错误:InvalidOperationException 跨线程操作无效 - C#

dgJEARequests正如您从图像中看到的那样,我有以下方法可以在 gridview ( ) 中显示自定义的项目选择。用户将选择将参数发送到查询的项目whereStatement。但是当许多复选框(项目)被标记或选中时,加载所有数据需要一些时间,dgJEARequests比如 5000 条记录,或者更少。所以,我决定添加一个WaitProcessing(带有进度条的表单)。当我单击搜索按钮btnSearchSelection时,我收到此错误:

附加信息:跨线程操作无效:控件“dgJEARequests”从创建它的线程以外的线程访问

这是代码progressbar

当我单击搜索按钮时,另一个是:

查询参数被发送到 Web 服务。我能做些什么来解决这个问题?我正在定制这个应用程序。我不是最初的开发者,但我的任务是让它变得更好。我知道那里有一些类似的错误,但情况不同。

截图:

做我的选择

选择

传递参数进行查询

参数

进度条

进度条

错误信息

错误

0 投票
0 回答
48 浏览

c# - 控件父级的跨线程异常

我正在从 UI 线程以外的线程调用 UpdateListView()。我在语句“_listView.BeginInvoke(//...//);”中遇到了跨线程异常 _tabControl 引发异常。

我应该如何处理这种情况?非常感谢谁能带我完成这个。

0 投票
1 回答
512 浏览

c# - C# DataBinding / 从另一个线程更新 DynamicObject 属性

以前我正在研究 DynamicObject 数据绑定的实现(请参阅Dynamic object two way data binding),并且该解决方案效果很好。从那以后,我遇到了能够更新来自不同线程的值的需要,这似乎破坏了绑定。我能够从多个线程更新 DynamicObject 实例,但是无法保持绑定更新。

我尝试在 SO: INotifyPropertyChanged 中实现 Cody Barnes 提供的 SynchronizedNotifyPropertyChanged 解决方案,导致跨线程错误没有成功。

对于绑定通过非 ui 线程更新的 DynamicObject 实现的任何帮助将不胜感激。附加的解决方案和要点效果很好(在任何线程(ui 或非 ui)上更新的值没问题),只是 DataBinding 到 Form Control 不是。

编辑 #1 - (谢谢 Reza Aghaei)

我明白我的问题在哪里有点模糊,这是我想要完成的实施和目标。

首先,我有处理创建可以运行任务的逻辑“引擎”的表单(基于内部类方法以及外部方法调用或事件)。因此,在 Form 类的某个地方,我生成了这个逻辑“引擎”对象(在本例中将其称为 GameEngine)。

现在在 GameEngine 类中,我实例化了 DynamicData (MyCustomObject)

请注意,在上面的示例中,MyCustomObject 是(当前)Reza 在他的回答中提供的内容的精确副本。在博客文章和提供的要点中,我倾向于提供的“选项 1”,因为我希望 DynamicData 对象 (MyCustomObject) 能够自包含用于可移植性目的的同步逻辑。

另一个注意事项,除了将 DynamicData 对象保存在属性中之外,GameEngine 不应该关心 UI 线程是否正在使用它,同步的责任(在我看来)应该由 UI 线程承担。话虽如此,DynamicData 对象应该知道跨线程调用并根据需要相应地处理它们。

编辑 #2 - 原始问题参考更新

在参照:

我尝试在 SO: INotifyPropertyChanged 中实现 Cody Barnes 提供的 SynchronizedNotifyPropertyChanged 解决方案,导致跨线程错误没有成功。

在使用原始 SO动态对象双向数据绑定和原始解决方案(再次感谢 Reza)时,我尝试实现引用的“包装器”以克服跨线程更新的问题。但是,使上述解决方案起作用的唯一方法是将属性硬编码到类中。当尝试使用动态对象时,绑定要么更新一次并丢失绑定,要么抛出某种绑定异常。

我希望这能更好地澄清最初的问题。

编辑 #3 - 符号未解析

不确定这是否是一个问题,因为编译正在工作,(这可能是 Resharper,不确定,因为我以前不记得这个问题)。

在“我的自定义对象”中:

(e.Value?.GetType()) <-- GetType is showing 'Cannot resolve symbol 'GetType'.

但是代码确实编译没有错误,所以我不确定我为什么/何时开始看到这个。

编辑 #4 - 已解决的编辑 #3

不知道是什么导致了 Edit 3 中的问题,但它发展成为显示其他错误(神秘地),例如Cannot apply indexing with to an expression of type 'System.Collections.Generic.Dictionary',但是,我做了一个Build -> Clean Solution然后关闭解决方案并在 Visual Studio 中重新打开它,问题似乎随着该错误突出显示而消失了在编辑器中(自从我开始使用 Resharper (EAP) 以来,我已经看到了一些类似的奇怪行为,所以可能是早期访问错误?但这个问题与这个 SO 无关,原来的 SO 已经解决并且奇怪JetBrains/Resharper Team 将更好地处理编辑 3 中的行为,而不是此时。

编辑#5 - 特别感谢

我希望这不是不合适的(如果是,管理员可以随意删除/编辑它),但是,我要特别感谢Reza Aghaei在 SO 和后台的所有帮助。Reza,您的博客、要点和其他有关此持续问题的帮助确实有助于解决问题并帮助我了解解决方案背后的原因。

0 投票
1 回答
584 浏览

c++ - 如何在本机 C++ 中跨线程调用(在主线程上回调)

我正在实现 C++ 移动应用程序来调用一些需要一些时间才能完成的进程,但我需要我的应用程序主线程仍在运行而没有任何阻塞。

问题:是否有任何库可以调用 runOnUIThread 以在主线程上取回结果?

了解有很多答案,例如消息事件队列轮询以在主线程上取回结果,或使用 future/promise 保持循环结果。但我不希望这种解决方案达到目标。

我相信 C++ 方式有一些函数来取回主线程循环器并调用具有多个入口点的函数到主线程?这篇文章我红了,我不是很明白是什么意思,希望有人能帮助。

本机 C++ 中的跨线程调用

0 投票
0 回答
78 浏览

c# - Control.InvokeRequired - 服从竞争条件

我在另一篇文章中找到了针对跨线程异常问题的建议解决方案,并在下面的代码中使用了它,但我发现它充其量是不稳定的。我的测试表明它的正确操作取决于竞争条件,所以我希望有人能够指出显而易见的或提供更强大的解决方案。

我有一个包含两个简单表单的程序,其中 Form1 的唯一目的是打开 Form2。Form2 仅包含一个 RichTextBox 并具有启动一个线程的代码,该线程以任意方式访问该 RichTextBox。当执行到达 InvokeRequired 属性时,它通常(但不总是)为假,因此它直接进入生成跨线程异常的 RichTextBox 访问。但是,当我在测试 InvokeRequired 属性之前调用 Thread.Sleep(...) 时,它似乎可以正常工作。但是,我讨厌将 Sleep 用于此目的,因为它看起来像是一种可能并不总是有效的方法。是否有可靠但合理的方式来进行跨线程通信?谢谢。

0 投票
1 回答
203 浏览

c# - DataGrid 在其 ItemSource 更新时不创建行,有时重复条目

我们正在制作一个 WPF 应用程序,它使用 FileSystemWatcher 来监视对用户选择的目录的更改并将更改输出到 DataGrid。在我的 MainWindow() 构造函数中,我将 DataGrid 绑定到我通过 ItemSource 调用 _eventList 的列表。

当 OnChanged 或 OnRenamed FileSystemWatcher 事件发生时,我的应用程序成功地将四组字符串(更改类型、受影响的文件、路径、上次修改日期)写入我调用的数组 _event 中。这构成一个事件。然后,在创建这个 _event 数组之后,我做了一个苍白的尝试来处理我的“调用线程无法访问这个对象,因为不同的线程拥有它”,通过调用一个名为 SetThreadSafe() 的单独方法来处理跨线程异常。

这就是我相信事情对我不利的地方。在我的 SetThreadSafe 方法中发生的不需要的行为是我的 DataGrid 显示它包含在它的 Items 属性中,对应于每个事件的条目。DataGrid.Items 中的每个索引都绑定到我的 _eventList 的同义词(应该如此),并且在此 List/Items 属性的每个索引内是数组的每个索引中的正确值。

因此,第一,我的 DataGrid 显示它在我的调试器中的 Items 属性中包含正确的数据,但这些行不会填充到我的 DataGrid 中。

两个,有时,不是全部,SetThreadSafe 方法触发它的 IF 和它的 ELSE 条件,因此在我的 DataGrid.Items/_eventList 中添加一个重复的条目。我不再遇到跨线程异常,但我觉得这里显然缺少一些东西。

[更新:感谢 Ash,我的问题得到了解决。我重新编辑了我的代码以反映正确的调整。现在一切正常。]

C#:

WPF XAML:

0 投票
0 回答
53 浏览

c# - 使用backgroudWorker C#时出现跨线程操作错误

我想在使用 backgroundWorker 将数据提取到文本框时显示一个进度条。但是在调试时,它引发了以下错误:

我已经阅读了类似的案例,但它无法解决我的问题。

System.InvalidOperationException:跨线程操作对 Texbox txtResults 无效。

我是 C# 新手,请帮助我!谢谢!

backgroundWorker DoWork 时发生错误。

已编辑:添加

0 投票
1 回答
222 浏览

vb.net - 如何使用 Timers.Timer 从另一个线程安全调用控件

我阅读了各种帖子,并做了一个练习项目,但它不起作用。该表单有一个按钮和一个带有默认文本“更新 0 次”的文本框。在按钮单击时启动计时器,并且每次使用文本更新的次数更新文本。

不抛出跨线程调用的异常,但是在调用文本框时,其.Text = "",更新的是文本而不是窗体上的文本框。并且 InvokeRequired 始终为假。

已解决在 TimerTest 类中添加了此代码“Private Shared myform As Form1 = Form1”,然后将“Form1.UpdateText”更改为“myform.UpdateText”

0 投票
0 回答
249 浏览

vb.net - .net 添加处理程序多线程

我在这里用vb中的多线程把自己绑起来。我有一个工作程序,我使用添加处理程序地址订阅 4 个事件,并指向我的主窗体上的一个函数。我有 4 个独立的函数,它们对每个函数的 4 个唯一地址中的每一个都执行完全相同的操作。他们需要调用,在函数顶部调用我的委托,然后该函数所做的就是生成另一个进程的线程并将处理移交给它。

当我使用该程序并处理来自其中一个订阅的事件时,一切都很好。当我开始处理 2 时它变得有点慢,然后我处理 4 并且它真的堵塞了。当我生成每个订阅的事件时,它们都同时发生,因此 Windows 会同时收到 4 个请求,并且可能会将它们排队并处理它们。所以这是我的应用程序中的 1 个瓶颈。

我想知道是否有可能将订阅的事件(即我添加处理程序地址到另一个线程)指向另一个线程,并在多个线程之间异步处理引发的事件,所以我没有排队在 1 个线程上。我知道这是可能的,因为我可以运行 2 个应用程序并处理其中 2 个拆分的事件,从而提高性能,如果我执行 4 个单独的应用程序也是如此。

我知道我有所有正确的部分,但我无法以正确的顺序将它们拼凑在一起。

抱歉举了一个粗略的例子,但这几乎突出了我目前正在做的事情

myevent.eventhashappened 是我希望跨多个线程同时执行的订阅,而不是使用 mainUI 线程来接收事件并在收到事件时将它们推送到其他程序线程。

我想把 Addhandler 订阅放在另一个类中,然后像这样调用它的实例

然后我可以像这样声明4个监听器类

那行得通吗?

只是想弄清楚我想在这里展示的东西

myevent.eventthappened 是我在开始时添加的钩子。外部事件会定期引发此事件(为清楚起见,目前未在代码中显示)

然后这会触发 ui 中的一个例程,该例程会产生一个处理事件的 New 进程的线程,执行一些处理(也未显示),启动线程,当线程完成时,它会使用一些参数回调到 ui 以更新(再次未显示)

我希望的行为是启动初始挂钩并在另一个不是 UI 的线程上处理。我总是不得不在某个时候返回 UI,但我想清除管道中的第一个瓶颈。

问候

0 投票
0 回答
92 浏览

c# - 使用EventHandler后的跨线程操作

我需要在另一个类中创建一个事件,所以我使用了一个 EventHandler 并且它工作正常,但是现在在我的主类表单中,当我尝试使用我得到的任何控件时:

所以在研究之后我可以调用:

但是,如果我在整个表单中执行此操作,将会有大量实例,我正在移动、调整大小、更改大量控件的文本。这似乎不对,一定与使用我不知道的 EventHandle 有关。在将一些代码移出新类并使用任务和事件之前,这些错误不会发生。

我在完成后和之前取消订阅该活动

请问有什么想法吗?

编辑:

我正在使用后台工作人员更新 UI,同时在 Form1 中接收串行命令。在另一堂课中,我使用 Task.Run 来设置电压 + 读取电压,而我不在设置电压。然后我使用 EventHandler 向 Form1 发送一个事件,这样它就知道在继续下一步之前已经设置了电压。

重新编辑:

我现在可以看到我有两个 Windows.Forms 线程,这导致了我的错误。当我在另一个类中调用一个方法时,这似乎正在发生,当它在 form1 中引发一个事件并且我尝试使用一个控件时,它会启动一个新线程。

是否可以告诉编译器继续使用现有的 Forms 线程而不是启动一个新线程?