问题标签 [backgroundworker]

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 投票
9 回答
10637 浏览

c# - 由于正在进行树遍历,目前无法修改此节点的逻辑子节点是什么意思?

我在后台工作线程的完成方法中设置对象的 DataContext。出于某种原因,我收到一条错误消息:

目前无法修改此节点的逻辑子节点,因为正在进行指向 Chart1.DataContext=allDates 行的树遍历。

a tree walk is in progress 是什么意思?我也尝试过使用 Dispatcher 操作来完成这个设置,并且给出了同样的错误......有什么想法吗?谷歌对此错误消息没有任何反应。

导致此问题的代码是 Microsoft 图表工具包的内部代码......我想知道我是否在他们的控制中发现了一个错误......

没有调度员:

与调度员:

错误:

0 投票
2 回答
970 浏览

c# - 在 C# 中检测停滞的 BackgroundWorker

我使用 backgroundworker 对象在需要的地方执行一些异步和线程。每隔一段时间,当我运行后台工作程序时,它就会在运行过程中停止并且没有完成。当我同时运行超过 1 个后台工作程序时,它通常会这样做。

当它停止时我想做的是取消操作并重新运行它。我的问题是我不知道如何检测它何时停止。我是否需要添加一些代码来“通知”工人已经停滞或无法知道?

谢谢,

0 投票
5 回答
15576 浏览

c# - 重启后台工作者

有没有办法直接“重启”后台工作人员?调用 CancelAsync() 后跟 RunWorkerAsync() 显然不会像他们的名字所暗示的那样做。

背景信息:我有一个后台工作人员,它在我的 .net 2.0 Windows 窗体应用程序中计算总数。每当用户修改属于此总数的任何值时,我想重新启动后台工作程序以防它正在运行,以便直接考虑最新值。

0 投票
2 回答
7784 浏览

wpf - 从 WinForms BackgroundWorker 创建 WPF 窗口

我有一个 WPF dll,其中包含许多 Window 类并公开显示这些窗口的方法。

我还有一个单独的 WinForms 项目,它在 BackgroundWorker 组件的 DoWork 方法中调用 WPF 项目中的这些方法之一。

在实例化 WPF 窗口的代码行中,我收到以下运行时错误:

调用线程必须是 STA,因为许多 UI 组件都需要这个。

谷歌搜索让我进入了这个讨论。(事实证明,除了 Stack Overflow,Jon Skeet 还回答了其他网站上的问题!)他链接到这篇文章,其中指出

BackgroundWorker 组件适用于 WPF ...

那篇文章还提到了使用 DispatcherObject 类,但我不明白如何使它工作,我宁愿继续使用我的 BackgroundWorker 组件。

作为测试用例,我想出了以下代码来重现错误。在 WPF 类库中,这里是 Window1.xaml.vb 中的代码

在 WinForms 应用程序中,这里是 Form1.vb 中的代码

即使将 BackgroundWorker 组件放在 Window1.xaml.vb 本身中,也会发生相同的错误。那么,那篇文章是不是错了,我真的不能将 BackgroundWorker 与 WPF 一起使用?或者我还需要做些什么才能让它工作吗?

如果 BackgroundWorker 不起作用,那么我将如何替换上面 Form1.vb 中的代码以使用 Dispatcher 呢?

0 投票
3 回答
1381 浏览

c# - 在winforms中取消Worker线程

我有两个列表框,一个是主人,另一个是孩子。当主节点上的索引发生变化时,子列表框会被与主节点相关的记录适当地填充。当一个主人需要很长时间才能获取所有记录并且在完成获取记录之前,用户单击另一个需要更少时间来填写的主人时,我的问题就出现了。最终会发生的情况是,即使用户不再在该主控上,花费更长时间的主控也会填充子列表框。

我一直在使用 BackgroundWorker 线程来进行填充。

我为 master 订阅了 SelectedIndexChanged 事件,并将 cancelled 设置为 true:

这是 DoWork 方法中的代码:

但是由于某种原因,worker完成的代码不断被调用。这是工人完成的代码:

我还需要做些什么来取消这个线程的返回吗?

0 投票
6 回答
2151 浏览

c# - BackgroundWorker 和 Timer,一次处理一项

我的应用程序监视用户可以上传文件的目录。当检测到新文件时,会将其添加到队列中。我有一个计时器,它在队列中运行并确定文件是否已完成上传。如果有任何文件是完整的,它将采用最新的并开始运行后台任务(使用 BackgroundWorker)。

我的问题是我不知道如何在后台任务运行时处理计时器。例如,如果计时器设置为 10 秒并且后台工作人员仍在工作,我希望计时器在下一次迭代之前跳过另一个后台工作人员的执行。

此外,每个任务的信息都存储在队列(ListView 控件)中,我将 ListViewItem 传递给后台工作人员。我很好奇传递 ListViewItem 是否有任何副作用。

谢谢!

0 投票
2 回答
1524 浏览

c# - 在列表框中添加项目时,BackgroundWorker 在 C# 中出现问题?

我有一个列表框,我必须在其中提供至少 2 个文件进行合并。当我单击合并按钮时,合并完成。进度条启动并出现消息框文件已合并。我正在使用后台工作人员运行进度条。

现在的问题是当合并完成 2 个文件时,我再添加一个文件,单击合并按钮 合并完成消息出现我单击消息框上的确定,再次出现消息框,显示合并已完成的相同消息。此消息框继续出现我在列表框中添加文件的次数。

例如,对于 2 个文件,消息出现 1ce den 在添加 1 个文件时出现消息 2ice,列表框中的 1 个文件消息出现 3ic.Like dis 它继续....

当我使用调试器跟踪它时,我注意到每当我在列表框中添加文件时,我的 Background Worker Runcompleted 事件都会被调用多次。这是合并按钮单击事件的代码...

我不知道我哪里错了。请帮助...谢谢...

0 投票
4 回答
4803 浏览

c# - 我如何“Thread.Join”一个 BackgroundWorker?

假设我正在向用户展示一个表单,并使用 BackgroundWorker 在幕后做一些工作。

当用户单击“确定”时,在 BackgroundWorker 完成之前我无法继续。如果用户单击确定时它还没有完成,我想显示一个 WaitCursor 直到它完成,然后继续。

实现这一点的最佳方法是什么?

我知道我可以使用一个普通的旧线程,然后执行 Thread.Join,但我喜欢 BackgroundWorker。

可以做得很好吗?

0 投票
2 回答
264 浏览

.net - 如何缓冲 .net BackgroundWorker 的输出?

我有一个来自外部源的数据流,我目前在BackgroundWorker. 每次它获得另一块数据时,它都会使用ReportProgress()调用将该数据呈现给 GUI。

我得到的印象是该ProgressChanged函数只是一个同步机制,所以当我的工作线程调用它时,两个线程都被锁定,而 GUI 线程处理更改。所以我认为问题在于,当后台线程更新 GUI 时,它无法接收任何数据,这意味着我们丢失了一些数据包。这是正确的还是我的丢包更有可能来自其他地方?

如果这原因,那么添加第二个线程来进行 GUI 更新是一个合理的解决方案,还是有更好/更彻底的方法来解决我应该深入研究的这些问题?

非常欢迎任何想法和建议。

0 投票
5 回答
52539 浏览

c# - BackgroundWorker 中未处理的异常

我有一个小型 WinForms 应用程序,它利用 BackgroundWorker 对象来执行长时间运行的操作。

后台操作偶尔会引发异常,通常是当有人打开正在重新创建的文件时。

无论代码是否从 IDE 运行,.NET 都会弹出一个错误对话框,通知用户发生了未处理的异常。使用 Release 配置编译代码也不会改变这一点。

根据MSDN

如果操作引发了您的代码无法处理的异常,BackgroundWorker 会捕获该异常并将其传递给 RunWorkerCompleted 事件处理程序,在该处理程序中它作为 System.ComponentModel..::.RunWorkerCompletedEventArgs 的 Error 属性公开。如果您在 Visual Studio 调试器下运行,则调试器将在 DoWork 事件处理程序中引发未处理异常的位置中断。

我希望偶尔会抛出这些异常,并希望在 RunWorkerCompleted 事件中而不是在 DoWork 中处理它们。我的代码工作正常,错误在 RunWorkerCompleted 事件中得到了正确处理,但我无法终生弄清楚如何停止抱怨“未处理异常”发生的 .NET 错误对话框。

BackgroundWorker 不应该自动捕获该错误吗?这不是 MSDN 文档所说的吗?我需要做什么来通知 .NET 这个错误正在被处理,同时仍然允许异常传播到 RunWorkerCompletedEventArgs 的 Error 属性中?