异步 vs 多线程,何时使用每个选项?

3
这个页面,http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx,在线程部分中指出,异步方法不会在其他线程中运行,如果想使用其他线程,则需要使用Task.Run。因此我理解异步和线程是两个不同的概念,每种选项在某些情况下都很好用。我想知道什么情况下更适合使用异步,什么情况下更适合使用线程。谢谢。
1个回答

3
当你有持续的工作需要处理时,你可以使用线程。直接使用或是自定义写一个线程池。即使这样,你也可以将其隐藏在一个自定义任务计划程序后面(使用它自己的线程池)。
当你需要控制低级别线程参数时,线程具有一些优势 - 但这种情况非常少见。一些琐碎的东西,如设置优先级,你也可以在异步中完成(记得重新设置),但有时你需要为互操作设置相当多的内容。
然而,现在的线程是一个非常低级别的 API ,因为使用自定义调度器的任务已经存在了,你几乎没有什么理由再使用线程,除非是在自定义任务调度器(可能在内部使用自定义线程池)之外。
当你分配一个线程进行长期处理时,线程也很方便。长期不一定是 "计算密集型"。我这里有一个 API,在自定义线程上运行24小时循环 - 我启动一个线程,调用一个“处理数据”方法,该方法回调到我这里。该方法要么在出现问题/错误时返回,要么每天一次(立即重新启动下一个实时数据块)。显然,忙碌不停,这是线程的好例子,而不是任务,因为任务的所有高级特性都没有用处。
现在几乎所有其他的情况下,我都使用任务/异步。

使用async/await,我能够利用所有的CPU吗?或者如果我要使用所有的CPU,我需要很多线程吗? - Álvaro García
我认为这个问题实际上不是关于TaskThread的区别,而更多地涉及到asyncTask.Run()的区别。 - svick
好的,当我说Task.Run时,是因为任务会创建一个新线程,而async不会,如果我没有记错的话。 - Álvaro García
不,实际上异步就是一个任务。它在默认调度程序上安排一个任务-完全相同。了解异步以及调用异步方法时返回的内容。编译器对任务的语法糖。 - TomTom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接