ASP.NET中的线程处理异步等待操作

时间:2016-06-22 12:41:44

标签: c# asp.net multithreading

对于长时间运行的操作,如果asp.net线程被释放到服务器其他请求。在哪个线程上执行长时间运行的操作以及如何在完成后获取asp.net线程。

2 个答案:

答案 0 :(得分:6)

正如我在博客中描述的long-running I/O operations do not require a thread at all。相反,它们使用自然异步I / O,它不需要线程。

设备驱动程序通常使用DMA,这允许设备直接读取/写出主系统RAM。 .NET使用IOCP(I / O完成端口)作为线程池的一部分来补充这种方法,允许每个appdomain的单个线程(或非常少的线程)等待大量的I / O操作。

要回答问题的后半部分,异步方法随请求上下文一起恢复,但可能会或可能不会在它所在的同一个线程上在await之前。更常见的情况是当I / O操作完成时,它向IOCP发出信号,它使线程池线程执行一些内务处理(将任务标记为完成等),然后该相同的线程进入ASP.NET请求上下文并继续执行处理程序。这并不总是发生 - 有时需要线程切换 - 但这是最​​常见的情况。

答案 1 :(得分:1)

要回答您的问题,所有线程都是从线程池中提取的。

可以这样给出一个示例场景,当服务器收到请求时,从池中抽取可用线程来为请求提供服务。

然后你产生一个新线程(通过Async或其他方式)。现在,从池中抽取一个新线程来运行Async正文的请求。

同时原始线程被释放到池中并返回处理另一个请求。

当您的线程完成后,它会从池中取回另一个线程(可能与原始线程不同)并完成您的请求。

如果此进程受CPU限制,那么完全浪费时间,因为您阻止了一个线程(来自同一个池)。但是,IO绑定操作可以像这样处理,因为它们不使用线程。