在过去的几天里,我测试了.net 4.5和c#5的新功能.
我喜欢它的新async/await功能.之前我曾使用BackgroundWorker通过响应式UI在后台处理更长的进程.
我的问题是:在拥有这些不错的新功能之后,我何时应该使用async/await和什么时候使用BackgroundWorker?两者的常见情况是什么?
c# backgroundworker task-parallel-library async-await .net-4.5
任务并行库是否有任何可以被认为是对BackgroundWorker类的替换或改进?
我有一个带有向导式UI的WinForms应用程序,它执行一些长时间运行的任务.我希望能够使用标准进度条和取消操作的响应式UI.我之前用BackgroundWorker做过这个,但是我想知道是否有一些可以使用的TPL模式?
编辑
我接受了乔恩的评论并重新审视了整个事情.事实上,它是阻塞UI线程.我必须以某种方式弄乱我的初步测试.字符串"OnResume exits" 在 SomeAsync完成后写入.如果方法被更改为使用await Task.WhenAll(t)它将(如预期)不阻止.感谢您的投入!我首先考虑删除这个问题,因为最初的假设是错误的,但我认为答案包含了不应丢失的有价值的信息.
原帖:
试图了解async-await更深入的内部结构.以下示例来自使用Xamarin的Android应用.OnResume()在UI线程上执行.
SomeAsync()开始一个新任务(=它产生一个线程).然后它Task.WaitAll()用于执行阻塞等待(如果WhenAll()是更好的选择,现在不讨论).Task.WaitAll()运行时没有被阻止.所以SomeAsync()不在UI线程上运行.这意味着创建了一个新线程.如何await"知道"它必须在这里产生一个线程 - 它会一直这样做吗?如果我改变了WaitAll()to WhenAll(),就不需要像我理解的那样快速增加一个额外的线程.
// This runs on the UI thread.
async override OnResume()
{
// What happens here? Not necessarily a new thread I suppose. But what else?
Console.WriteLine ("OnResume is about to call an async method.");
await SomeAsync();
// Here we are back on the …Run Code Online (Sandbox Code Playgroud)