【问题标题】:Still not getting how to return a value from BackgroundWorker仍然没有得到如何从 BackgroundWorker 返回值
【发布时间】:2019-07-14 17:32:14
【问题描述】:

我有一个简单的BackgroundWorker 应该会生成结果,但我不知道如何将它们返回到我的调用方法。 我已经阅读了许多答案,它们都向我展示了RunWorkerCompleted 事件如何接收DoWork 事件处理程序的结果,并且为了证明这一点,它们显示了一个带有结果的消息框。这一切都很好,但是我如何将结果返回到调用RunWorkerAsync 的实际方法?

myResult=myBackGroundWorker.RunWorkerAsync(); // This obviously doesn't compile

这个答案特别有用:

How to make BackgroundWorker return an object

但我仍然不知道如何访问结果。 这个答案还提到了委托的使用:

BackgroundWorker Return A Value?

但我不明白这是否能解决我的问题,或者我是否仍能在 RunWorkCompleted 事件处理程序中得到结果。

【问题讨论】:

  • 如果你想要这样,我会推荐Taskawait
  • 如果不破解它的工作,您将无法将其返回到RunWorkerAsync 调用。 RunWorkerAsync启动 worker,完成后调用回调。你想要的会搞砸目的,因为你需要等待那个后台工作人员,这正是回调应该使不必要的。对于您的功能,您应该查看 async/await。
  • 最简单的方法是使用 ReportProgress。您可以返回一个状态对象,该对象可以返回一个或多个对象。见 msdn:docs.microsoft.com/en-us/dotnet/api/…
  • 你的问题零意义。像BackgroundWorker 这样的类及其方法RunWorkerAsync() 的全部意义在于,当您希望在后台 完成后台工作时调用该方法。根据定义,这意味着当RunWorkerAsync() 方法返回时,工作尚未完成。考虑到方法的整个点要在工作结果可用之前返回,该方法怎么可能返回工作结果?
  • @PeterDuniho 我显然没有正确理解 backgroundworker 的用法,但我认为我没有任何意义......最后我只是想从后台操作中获取结果,正如许多其他人更有建设性地指出的那样,可以使用任务和异步/等待来实现。

标签: c# backgroundworker


【解决方案1】:

简短的回答:你不能。


想想将值返回给调用RunWorkerAsync 的方法意味着什么。这意味着该方法必须暂停执行,等待后台工作人员完成其工作,然后再继续。但是您仍然希望在等待期间运行其他方法,否则 UI 会冻结。

你觉得这很熟悉吗?这基本上就是async 方法遇到await 表达式时所做的事情!

BackgroundWorker 是一个相当古老的 API,并且在它出现时并没有 async/await 的花哨功能(无论如何,async/await 是一种语言 功能),这就是它的原因使用事件来解决问题。那时,还没有办法异步执行操作,并优雅地将值返回给调用者。

现在我们有了 async/await,你可以用它来做你想做的事:

someReuslt = await Task.Run(() => { ... });

如果您根本没有听说过 async/await,this 是一个不错的起点。

【讨论】:

  • 谢谢,显然我试图使用错误的方法。我会好好阅读 async/await 并尝试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多