我有一个.NET Windows服务,该服务使用BeginRead / EndRead异步I / O范例实现套接字服务器。现在,此套接字代码需要调用一些异步/任务/等待异步代码。
我一直在使用Nito.AsyncEx库的AsyncContext类的Run方法,但是对于从EndRead调用是否会阻塞并保留工作线程为人质,我持保留态度。我对之前的问题的建议是使用Task.Run而不是Nito.AsyncEx的AsyncContext.Run。这会将调用提交到异步/等待代码中,并立即返回。在我看来,在负载下,客户端没有任何回滚可以阻止请求充斥线程池。
我将重新询问有关Nito.AsyncEx的AsyncContext.Run的原始问题:它是否保留了被调用的线程(调用我套接字的EndRead回调的池线程)为人质,还是在异步I / O时释放了该线程?它的调用发生在后台?
如果Nito.AsyncEx的AsyncContext.Run确实被阻止,那么Task.Run似乎是我唯一的选择。关于如何回滚客户端请求以防止线程池耗尽的任何建议?
的目的AsyncContext.Run
是阻止所有异步操作完成。它确实保留线程,直到发生这种情况。
我建议您重新考虑到目前为止的所有假设:
End*
回调已在线程池线程上调用。如果您确定确实需要实现自己的TCP / IP服务器,并且无法在回调中同步进行工作,并且确实需要进行限制...则考虑使用Reactive Extensions或TPL Dataflow。这两个库都具有可选的内置限制功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句