仍然没有得到如何 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 是一个很好的起点。
我有一个应该生成结果的简单 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 是一个很好的起点。