【发布时间】:2013-01-31 21:38:03
【问题描述】:
如果我有一个 Web 应用程序,它将对网络和数据库的调用包装在 Task<T> 中并等待它们,这应该可以防止线程阻塞,以便可以重复使用。
但是,在进行 IO 工作时,是否还有一些线程被阻塞,所以等待并没有真正的好处?
【问题讨论】:
标签: c# async-await c#-5.0
如果我有一个 Web 应用程序,它将对网络和数据库的调用包装在 Task<T> 中并等待它们,这应该可以防止线程阻塞,以便可以重复使用。
但是,在进行 IO 工作时,是否还有一些线程被阻塞,所以等待并没有真正的好处?
【问题讨论】:
标签: c# async-await c#-5.0
如果您只是将阻塞调用封装在 Task.Run 中,那么您是对的:没有任何好处。
但是,如果您使用的是自然异步方法(例如,异步 HttpClient/WebClient/HttpWebRequest 方法和异步数据库方法),那么这些请求不会使用任何线程,并且您可以获得可扩展性优势.
在 Windows 的设备驱动程序级别,所有 I/O 都是异步的。同步 API 只是方便的包装器。自然异步方法不会阻塞同步 API 上的线程;它们是基于异步 API 构建的。
【讨论】: