仍然没有得到如何 return 来自 BackgroundWorker 的值

Still not getting how to return a value from 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 事件处理程序中得到结果。

简答:不能。


想想将值 return 返回给调用 RunWorkerAsync 的方法意味着什么。这意味着该方法必须暂停其执行,等待后台工作程序完成其工作,然后再次继续。但是在等待的时候你还是要用其他的方法运行,否则UI会死机。

这听起来很熟悉吗?这基本上就是 async 方法在遇到 await 表达式时所做的事情!

BackgroundWorker是个很老的API,出来的时候没有async/await的花哨功能(async/await是language feature anyway),这就是它使用事件来达到目的的原因。那时,没有办法异步执行操作,并且 return 优雅地将值返回给调用者。

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

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

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