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

wpf - 如何在 Dispatcher 中访问 WPF 对象?

我正在使用 MVVM 模式来开发 WPF 应用程序。

该应用程序从服务器加载验证码图像,并在准备好后将其分配给 WPF 表单上的图像。我正在使用 BackgroundWorker 为我做线程,如下所示:

加载 Window 时,将调用以下命令:

GetCaptchaImage 函数相当简单,在另一个线程中加载图像:

我需要知道如何调用 Dispatcher 将此 ImageSource 分配给我的 Window 的图像源,目前我在加载 _tempBitmap 后调用调度程序,如下所示:

CaptchaBitmap 数据绑定到我的图像源的位置。

但是,当我这样做时,会引发 InvalidOperationException,并且对 _tempBitmap 的任何引用都会在 GUI 线程中返回错误。我知道它是因为当它是在 BackgroundWorker 线程中创建时,我从调度程序 GUI 线程访问它,但我该如何解决呢?

帮助将不胜感激!:)

0 投票
1 回答
1827 浏览

c# - WebService 上下文中的后台工作线程

好的,所以我在 Web 服务中有 Call1,它将启动一个免费的工作线程以开始进行一些处理,但希望有另一个调用(Call2)将通过引用监视原始工作线程?

关于如何做到这一点的任何建议?我真的很想远离 WinService 来做我的处理。因为我需要它更实时。

0 投票
0 回答
1437 浏览

.net - ProcessStartInfo.UseShellExecute = false 怎么会导致 FreeImageNet 在单独的线程上出现奇怪的行为?

我在 BackgroundWorker 中运行一个进程来调整图像大小。如果我UseShellExecute = false在进程的startinfo上进行设置,如果我在 UI 线程上使用FreeImageNet库进行任何同时图像操作,我会得到奇怪的行为。奇怪的行为是,当我通过CloseMultiBitmap()该方法关闭新图像时似乎可以工作,但它只留下 FICACHE 和 FISPOOL 文件,而不是最终图像。如果我设置UseShellExecute = true一切按预期工作。

backgroundworker 进程调用 ImageMagick 的 convert.exe 命令行程序。但是,如果我运行任何命令,就会发生这种情况。它确实似乎是由于 UseShellExecute 属性。我保证我不会处理来自不同线程的相同图像。

基本上,该程序加载多页 t​​iff 文件以进行拆分和合并操作。当我加载 tiff 时,每个页面都从原始页面中提取并保存在临时文件夹中。然后我使用 backgroundworker 为每个页面生成预览图像。每页大约需要半秒,因此 60 页的 tif 可能需要一些时间来加载。在加载预览图像时,您可以进行合并和拆分。我目前只对原始图像进行操作。

任何人都可以对 UseShellExecute 有所了解吗?我希望能够阅读 StandardError。我只是看不到这个属性如何影响在单独线程上运行的代码。

谢谢你的时间。

0 投票
4 回答
15794 浏览

c# - C# backgroundWorker 报告字符串?

如何从 backgroundWorker 以及百分比向我的 windows.form 报告字符串(如“正在搜索文件......”,“找到的选择......”)。此外,我有一个大类,其中包含我想在 backgroundWorker_Work 中运行的方法。我可以通过 Class_method() 调用它;但我无法报告我完成的百分比或来自被调用类的任何内容,只能来自 backgroundWorker_Work 方法。

谢谢!

0 投票
4 回答
2487 浏览

c# - 如何从 backgroundWorker 的外部类调用的方法调用表单上的方法?

如何从 backgroundWorker 的外部类调用的方法调用表单上的方法?我相信代表们在某种程度上是这个问题的答案,但是在花时间阅读之后,我仍然对这个问题感到困惑。

这是在 Visual Studio 2008 中,backgroundWorker从表单运行并调用ExternalClass.Method。该表单位于命名空间 ProgramName中,而ExternalClass正在使用 ProgramName。当我在 windows.form 文件的命名空间ProgramName中声明公共委托 MyDelegate时,我可以创建MyDelegate的实例并在我的表单的方法中调用它(但这对我没有帮助),但是如果我尝试创建一个MyDelegate的实例并从我的外部类的方法调用它我无法访问 windows.form 的方法,即使它是公共的。

谢谢

是的,我想从ExternalClass.Method传回进度报告(整数百分比,字符串状态) 。你能解释一下那个 CSharpAtl(或任何人)吗?

0 投票
6 回答
1310 浏览

c# - 在集合项中使用的 BackgroundWorker

我使用 Backgroudworker 做一些工作,以完成一些耗时的任务。

另一种方法启动后台工作者:

然后我做了事件处理:

如您所见,我在完成后重新启动了工人。现在这适用于单个后台工作人员。

现在我想要一个集合,每个项目都应该执行这个任务。然而,有了上面的概念,它只会在第一个启动的worker中继续运行,因为它会重新启动worker。我在想,也许 Timer 的组合可以解决这种情况,为其他工作线程提供方式。

BackgroundWorker 仍然是一个不错的选择吗?像我一样重用 BackgroundWorker 是否常见?

编辑 1:澄清:我面临的问题是,我需要用自己的 BackgroundWorker 管理每个集合。我正在考虑一个计时器,以定期从每个项目中触发请求。这就是我卡住的地方。

编辑 2:查看我自己的答案,我没有解决这个问题,但发现我可以配合计时器来获得我想要的东西。

编辑 3:澄清(另一种尝试,我不擅长)我想要实现的目标:我有跟踪对象,用于 gps 跟踪。我想跟踪一大堆,所以每个跟踪设备一个对象。他们都需要经常轮询。我为单个测试对象设置了 BackgroundWorker。我喜欢后台工作人员在完成时告诉我的方式。但我无法让它与所有跟踪对象一起工作。

现在每个跟踪对象都有自己的计时器。这个计时器生成一个新线程并执行耗时的工作(我将其命名为 DoWrite)。不需要 BackgroundWorker,因为我处理了计时器然后创建了一个新计时器。这就是它所做的一切。

0 投票
2 回答
283 浏览

c# - C# 使委托对类可用

我想让一个代表可供整个班级使用。这样做的目的是允许来自外部类的 backgroundWorker 的调用方法通过它的所有方法(ExternalClass.Run();调用 ExternalClass.Method2();ExternalClass.Method3();等等,它们都需要发送几个进度报告。必须不断地通过委托似乎效率低下。

我尝试全局初始化委托的实例并将其设置为等于 Run() 中传递的实例;然后每种方法都可以使用,但我收到一个错误,即无法隐式转换空对象。

谢谢!

我无法显示我正在使用的代码,因为我目前没有它(它在我的笔记本电脑上),但我现在会尝试更好地解释。伪代码:

我真的不想每次都通过它是重点,我想以某种方式将它传递给class2

0 投票
10 回答
82077 浏览

.net - 如何正确等待 BackgroundWorker 完成?

观察以下代码:

现在假设我想等到bw完成工作。这样做的正确方法是什么?

我的解决方案是这样的:

但我不喜欢它。

我考虑过用finished同步事件替换标志,在RunWorkerCompleted处理程序中设置它并稍后阻止它,而不是执行 while-sleep 循环。

唉,这是错误的,因为代码可能在 WPF 或 WindowsForm 同步上下文中运行,在这种情况下,我会阻塞与处理程序运行相同的线程RunWorkerCompleted,这显然不是很聪明的举动。

我想知道一个更好的解决方案。

谢谢。

编辑:

附言

  • 为了澄清我的问题,故意设计了示例代码。我完全了解完成回调,但我想知道如何等到完成。那是我的问题。
  • 我知道Thread.Join, Delegate.BeginInvoke, ThreadPool.QueueUserWorkItem, 等等...这个问题具体是关于BackgroundWorker.

编辑2:

好的,我想如果我解释一下场景会容易得多。

我有一个单元测试方法,它调用一些异步代码,而这些代码最终会参与BackgroundWorker我能够将完成处理程序传递给它的对象。所有代码都是我的,所以如果我愿意,我可以更改实现。但是,我不会替换BackgroundWorker,因为它会自动使用正确的同步上下文,因此当在 UI 线程上调用代码时,会在同一个 UI 线程上调用完成回调,这非常好。

无论如何,单元测试方法有可能在 BW 完成工作之前就结束了,这是不好的。所以我希望等到 BW 完成并想知道最好的方法。

它还有更多部分,但整体情况或多或少像我刚刚描述的那样。

0 投票
3 回答
7019 浏览

c# - 使用后台工作人员 - 更新递归方法进度的 ProgressBar

下面是一种我想发送给后台工作人员的方法,但我正在努力根据我的方法的创建方式来实现它。如您所知,它不会返回任何可以的内容,但每次调用它时都需要一个 directoryInfo 对象。

这是我第一次使用后台工作人员,所以我有点卡住了,由于在这里找到的帮助,我尝试实现一些东西,但是当我意识到我的方法是递归的时就卡住了。

如何在繁忙的循环中显示进度?

我实现了一个 doWork 事件处理程序方法,但注意到如果我有更多文件和文件夹要在较低的子级别上处理,我需要以某种方式调用该方法。

我有一个简单的按钮单击事件处理程序,当当前选定的节点是目录时,它调用我的“getSizeForTargetDirectory()”方法。

希望这能解释我想要做什么以及我是如何做到的。问题是当我尝试交付的大部分工作来自递归方法时,我如何使用后台工作人员类的报告进度功能。

通过早期测试,我注意到我的 getSize 方法在经过一些调整后非常有效,并且非常快速地报告了当前提供的文件夹的大小信息,但是我再次使用了功能强大的开发机器,因此这可能不适用于所有用户。

感谢阅读,希望有人能帮忙!!!

0 投票
2 回答
4306 浏览

c# - 如何在c#中指定时间后取消后台工作人员

如何在 c# 中指定时间后取消后台工作人员或取消未响应的后台工作人员。