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

Posted

技术标签:

【中文标题】异步与线程,何时使用每个选项?【英文标题】:async vs threading, when to use each option? 【发布时间】:2012-11-27 06:14:51 【问题描述】:

这个页面,http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx,在线程部分,说异步方法不在其他线程中运行,如果我想使用其他线程,我会使用 Task.Run。

所以我知道异步和线程是两个不同的东西,每个选项都适用于某些情况。我想知道什么时候使用异步更好,什么时候使用线程更好。

谢谢。

【问题讨论】:

【参考方案1】:

当你有持续的工作要做时,你会使用线程。直接使用自定义写入池。即使这样,您也可以将其隐藏在自定义任务计划程序后面(使用他自己的线程池)。

当你不需要控制低级线程参数时,线程有一些优势——这是非常罕见的。诸如设置优先级之类的琐事您也可以在异步中执行(记住要回退),但有时您需要为互操作设置很多东西。

不过,这些天线程是一个非常低级别的 API - 由于任务与自定义调度程序一起使用,您确实很少使用自定义任务调度程序之外的线程(它可能在内部使用自定义线程的线程池低级别 API)。

当您为 LONG TERM 分配线程时,线程也很方便。长期不一定是“计算密集型”。我在这里有一个在自定义线程上以 24 小时循环运行的 API - 我启动一个线程,调用一个“处理数据”方法,该方法会回调给我。该方法在问题/错误时返回,或每天一次(为下一个实时数据块立即重新启动)。显然,忙个不停,这是线程的好例子,而不是任务,因为任务的所有高级功能都是无用的。

对于几乎所有其他事情这些天我使用任务/异步。

【讨论】:

如果使用 async/awiat,我会使用所有 CPU,或者如果我使用所有 CPU,我需要很多线程? 我认为问题不在于TaskThread,而更多的是关于asyncTask.Run() 好吧,当我说 Task.Run 是因为任务创建了一个新线程,而不是异步,如果我没记错的话。 不,实际上异步是一项任务。它在默认调度程序上调度任务 - 完全相同。阅读异步及其含义以及调用异步方法时返回的内容。围绕任务的编译器糖。

以上是关于异步与线程,何时使用每个选项?的主要内容,如果未能解决你的问题,请参考以下文章

C# 线程异步处理

ALSA:如何判断声音何时播放完毕

(Git 合并)何时使用“我们的”策略、“我们的”选项和“他们的”选项?

何时使用RX

如何识别 QTabWidget 中当前选项卡何时发生变化?

App Engine 调度程序何时使用新线程与新实例?