相关疑难解决方法(0)

Async/await vs BackgroundWorker

在过去的几天里,我测试了.net 4.5和c#5的新功能.

我喜欢它的新async/await功能.之前我曾使用BackgroundWorker通过响应式UI在后台处理更长的进程.

我的问题是:在拥有这些不错的新功能之后,我何时应该使用async/await和什么时候使用BackgroundWorker?两者的常见情况是什么?

c# backgroundworker task-parallel-library async-await .net-4.5

154
推荐指数
5
解决办法
8万
查看次数

BackgroundWorker的任务并行库替换?

任务并行库是否有任何可以被认为是对BackgroundWorker类的替换或改进?

我有一个带有向导式UI的WinForms应用程序,它执行一些长时间运行的任务.我希望能够使用标准进度条和取消操作的响应式UI.我之前用BackgroundWorker做过这个,但是我想知道是否有一些可以使用的TPL模式?

c# backgroundworker winforms task-parallel-library

82
推荐指数
2
解决办法
4万
查看次数

运行时如何知道何时使用"await"生成线程?

编辑

我接受了乔恩的评论并重新审视了整个事情.事实上,它阻塞UI线程.我必须以某种方式弄乱我的初步测试.字符串"OnResume exits" SomeAsync完成写入.如果方法被更改为使用await Task.WhenAll(t)它将(如预期)不阻止.感谢您的投入!我首先考虑删除这个问题,因为最初的假设是错误的,但我认为答案包含了不应丢失的有价值的信息.

原帖:

试图了解async-await更深入的内部结构.以下示例来自使用Xamarin的Android应用.OnResume()在UI线程上执行.

  • SomeAsync()开始一个新任务(=它产生一个线程).然后它Task.WaitAll()用于执行阻塞等待(如果WhenAll()是更好的选择,现在不讨论).
  • 我可以看到UI在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)

c# async-await

6
推荐指数
1
解决办法
182
查看次数