小编Mic*_*oni的帖子

使用Task.Run以致线程池耗尽时会发生什么?

我有一个.NET Windows服务,它使用BeginRead/EndRead异步I/O范例实现套接字服务器.现在这个套接字代码需要调用一些async/Task/await异步代码.

我一直在使用Nito.AsyncEx库的AsyncContext类'Run方法,但是我对从EndRead调用它是否会阻塞,保持工作线程人质有所保留.我得到的早期问题的建议是使用Task.Run而不是Nito.AsyncEx的AsyncContext.Run.这会将调用提交到async/await代码并立即返回.在我看来,在负载下,客户端没有任何阻止来阻止请求泛滥线程池.

我将重新询问关于Nito的原始问题.AsyncEx的AsyncContext.Run:它是否保持调用的线程(池线程调用我的套接字的EndRead回调)作为人质,或者在异步I/O时释放该线程它的调用是在后台发生的?

如果Nito.AsyncEx的AsyncContext.Run真正阻止,那么Task.Run似乎是我唯一的选择.有关如何回击客户端请求以防止线程池耗尽的任何建议?

.net threadpool task-parallel-library async-await

2
推荐指数
1
解决办法
1112
查看次数