我想知道当没有IO线程处理异步调用的结果时会发生什么。假设你做了一个异步web请求(在服务器应用程序中,所有的异步代码都由线程池处理)。操作系统会发出信号,告诉您何时有结果,何时需要IO线程从套接字读取字节。如果没有IO线程可用,因为这些线程都在使用中(全部含义由线程池设置的最大值)会发生什么情况?有信号可以等待,直到有线程可用的队列吗?还是信号只是闻所未闻?如果后者发生,等待等待的代码会发生什么?如果没有IO线程来处理异步结果,会发生什么情况?
回答
除非您限制了线程池,否则它将根据需要创建新的I/O线程。信号以类似队列的结构等待,称为I/O Completion Port (IOCP),直到它被检索到;信号不会丢失。
线程池具有IO(和worker)线程数的最大值。你说它会超过这个价值来处理这些信号?或者只是如果我们不是最大的一个新的线程将被创建,否则它坐落在IOCP队列中? – shortspider
不,它不会超过限制,但如所暗示的那样,它将排队等待轮到它,并且如果IO线程的数量受到限制,等待时间将会延长 –
让我们回到更早的时候,当OS
使用初步和没有的concurrency
很大余地,那么,如果你打开多个应用程序,这需要IO
像Excel, Word, Pdf, Ppt
,系统将显示为红,反应迟钝,因为它不能将它们全部处理在一起,但是如果你停止排队请求更多,并且系统不会崩溃,那么你将看到所有这些人都有机会,并且他们再次活跃起来。
这是IO requests
已被排队等待处理的典型用例,它们中的任何一个都不会丢失,直到并且除非系统崩溃,由于其实现的鲁棒性,现在不会经常发生,记住蓝色死亡的屏幕,这仍然可以发生,这是IO请求丢失的唯一一点。
实际上,Windows中线程的本质就是在并发性之前引入健壮性,这样排队等待处理的东西就不会丢失。在任何时候,它都会超出限制以创建超过所需数量的线程
- 1. 如果在Application_Start中引发未处理的异常,会发生什么情况?
- 2. 如果CFile :: Write引发异常会发生什么情况?
- 3. 如果我的IExceptionPublisher引发异常,会发生什么情况?
- 4. 如果finally块引发异常,会发生什么情况?
- 5. 如果未捕获到异常,会发生什么情况?
- 6. 如果DTD链接无处可逃,会发生什么情况?
- 7. 如果printf没有处理,会发生什么
- 8. 如果正在处理的活套正在退出,会发生什么情况?
- 9. 如果我在asp.net中创建线程,会发生什么情况?
- 10. 如果从主线程外部调用dispatch_main,会发生什么情况?
- 11. 如果没有线程正在等待并发送条件信号,会发生什么情况?
- 12. 如果任何异常情况发生
- 13. 如果在SqlDataReader之前关闭SqlConnection,会发生什么情况?
- 14. 如果我使用printf(“one \ 0two”),会发生什么情况;?
- 15. TFS - 如果我删除工作区会发生什么情况?
- 16. 如果浏览器不支持gzip,会发生什么情况?
- 17. 如果NSURLCache已满,会发生什么情况?
- 18. 如果未安装代码合同,会发生什么情况?
- 19. 如果打开失败会发生什么情况?
- 20. 如果php.ini丢失,会发生什么情况?
- 21. 如果超时,会发生什么情况?
- 22. 如果不使用Xmx会发生什么情况?
- 23. 如果MySQL数据库未关闭,会发生什么情况?
- 24. minimax:如果min不起作用会发生什么情况
- 25. 如果堆栈内存变满,会发生什么情况
- 26. 如果Web服务更改参数会发生什么情况?
- 27. 如果决策器未运行,会发生什么情况
- 28. 如果消息在MQ中回滚会发生什么情况?
- 29. 如果minSdkVersion低于targetSdkVersion,会发生什么情况?
- 30. 如果我不指定targetFramework =“4.0”,会发生什么情况?
当您要求计算机执行太多操作时会发生这种情况:它只会减慢速度。这是非常深埋,实际上不是CLR的一部分,[IHostIOCompletionManager接口](https://msdn.microsoft.com/en-us/library/ms164490(v = vs.110).aspx)可以完成工作。取决于你使用的主机。在实践中,假设SetMaxThreads()的* completionPortThreads *参数完全被忽略,同时执行的*(未等待)io完成的最大数量等于处理器内核的数量通常是安全的。 –