对于长时间运行操作,如果将asp.net线程释放到服务器的其他请求。在哪个线程上执行长时间运行的操作,以及在完成时如何获得asp.net线程。ASP.NET中的线程处理异步等待操作
4
A
回答
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
要回答你的问题,所有线程都来自线程池。
可以这样给出一个示例场景,当服务器收到请求时,将从池中提取可用线程来为请求提供服务。
然后你产生一个新的线程(通过Async
或其他手段)。现在从池中抽取一个新线程来运行您的Async
正文的请求。
同时,原始线程被释放到池中并返回处理另一个请求。
当线程完成时,它从池中取回另一个线程(可能与原始线程不同)并完成请求。
由于您阻止一个线程(来自同一个池),因此如果此进程受到CPU限制,则这会浪费时间。但是,IO绑定操作可以像这样处理,因为它们不使用线程。
相关问题
- 1. 等待异步操作
- 2. 等待事件处理程序异步
- 3. 异步等待处理程序死锁
- 4. 异步/等待与线程
- 5. C#异步等待Task.delay中的操作
- 6. 即使异步I/O操作正在等待,只有处理io_service的线程正在等待
- 7. ASP.NET异步调用的问题,等待处理程序返回
- 8. 十字UI线程异步与无效操作等待
- 9. 跨线程操作无效使用异步/等待在VSTO
- 10. iOS线程等待操作
- 11. ASP.Net自定义处理程序中的异步操作
- 12. 长处理线程异步ASP.NET网页
- 13. 循环异步等待操作奇怪
- 14. C#异步操作不等待wp8.1
- 15. 如何等待所有异步操作?
- 16. 等待完成异步操作
- 17. 异步操作立即等待
- 18. 如何异步/等待redux-thunk操作?
- 19. 节点 - 如何等待异步操作?
- 20. asio - 等待异步操作完成
- 21. 等待异步操作完成
- 22. 等待节点异步操作
- 23. 等待异步操作完成android
- 24. python gio等待异步操作完成
- 25. C#等待异步操作完成
- 26. 异步/等待和WebException处理
- 27. 等待主线程停止,直到任务被异步线程处理
- 28. Windows Store应用程序 - 同步等待异步操作
- 29. 同步操作使用异步/等待(主要是留在UI线程上)
- 30. ReactNative AsyncStorage结合异步/等待。 setItem操作需要“等待”吗?
谢谢Stephen Cleary! – Sunny
如果它不是I/O操作会怎么样。如果它是一个在一个函数中执行并且消耗很多时间的业务逻辑。它不会创建一个新的线程。 – Sunny
@Sunny:不可以。如果你在没有await的情况下使用'async',那么代码就直接在调用线程上运行。如果使用'await Task.Run',那么'Task.Run'(*不是'async' /'await')将使用单独的线程池线程(注意:这不建议在ASP.NET上使用)。 –