仍然没有如何从BackgroundWorker返回值

时间:2019-07-14 17:32:14

标签: c# backgroundworker

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

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

这个答案特别有用:

How to make BackgroundWorker return an object

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

BackgroundWorker Return A Value?

但是我不知道这是否可以解决我的问题,或者我是否仍然会在RunWorkCompleted事件处理程序中获取结果。

1 个答案:

答案 0 :(得分:3)

简短的回答:您不能。


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

您听起来很熟悉吗?当遇到async表达式时,这基本上就是await方法的作用!

BackgroundWorker是一个很老的API,它发布时并没有花哨的async / await功能(无论如何,async / await是 language 功能),这是为什么它使用事件来解决问题。那时,还没有一种方法可以异步进行操作,并且可以优雅地将值返回给调用方。

现在我们有了async / await,您可以使用它来执行您想要的操作:

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

如果您根本没有听说过异步/等待,那么this是一个不错的起点。