对于长时间运行的操作,如果asp.net线程被释放到服务器其他请求。在哪个线程上执行长时间运行的操作以及如何在完成后获取asp.net线程。
答案 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绑定操作可以像这样处理,因为它们不使用线程。