.net Task.Factory.FromAsync和RegisterWaitForSingleObject-不';后者不会扼杀前者的效用吗?
该问题可通过MSDN的以下引用来描述: 在异步方法期间,CommandTimeout属性将被忽略 调用BeginExecuteReader等 在谷歌上搜索这个问题的解决方案,我偶然发现了一些帖子,建议将.net Task.Factory.FromAsync和RegisterWaitForSingleObject-不';后者不会扼杀前者的效用吗?,.net,multithreading,asynchronous,io,timeout,.net,Multithreading,Asynchronous,Io,Timeout,该问题可通过MSDN的以下引用来描述: 在异步方法期间,CommandTimeout属性将被忽略 调用BeginExecuteReader等 在谷歌上搜索这个问题的解决方案,我偶然发现了一些帖子,建议将Task.Factory.fromsync与ThreadPool.RegisterWaitForSingleObject结合使用 因此,我们可以查看并讨论异步web请求,而不是SQL命令。但问题都是一样的——从异步SQL命令/Web请求超时 建议的方法是调用Task.Factory.fromsyn
Task.Factory.fromsync
与ThreadPool.RegisterWaitForSingleObject
结合使用
因此,我们可以查看并讨论异步web请求,而不是SQL命令。但问题都是一样的——从异步SQL命令/Web请求超时
建议的方法是调用Task.Factory.fromsync
,然后调用ThreadPool.RegisterWaitForSingleObject
,以等待或超时任务对应的句柄
我不明白这里有什么。异步IO方法利用IO完成端口回调来返回结果。当这样的IO操作启动时,调用线程返回线程池,供其他请求重用
另一方面,根据MSDN:
RegisterWaitForSingleObject方法将指定的委托排入线程池队列
及
等待线程使用Win32 WaitForMultipleObjects函数
监视已注册的等待操作
这意味着它会阻塞线程池线程,直到异步IO返回或出现超时。如果我的理解是正确的,如果我们使用这种技术,那么使用N个异步IOs将阻止并锁定N个线程池线程
但是,在这种情况下使用异步IO有什么意义呢?所有IOCP数据都被RegisterWaitForSingleObject
杀死
另一方面,根据,RegisterWaitForSingleObject
优化了等待,将来自同一线程的多个句柄批处理为对WaitForMultipleObjects
的一个调用,而这反过来又限制了它可以等待的句柄数量,即64个
那么,如果每个请求都有65个异步IO请求从同一个线程与RegisterWaitForSingleObject
一起发出,那么有多少线程池线程(b)被锁定
那么,如果每个请求都有65个异步IO请求与RegisterWaitForSingleObject一起从同一线程发出,那么有多少线程池线程(b)被锁定
两个(对于RegisterWaitForSingleObject
调用)-每个线程池线程可以处理64个请求(从技术上讲,它是最大等待\u对象的值,实际上是64个)
后者不正是扼杀了前者的效用吗
不会。它确实降低了它的效率,但由于在RegisterWaitForSingleObject
中存在线程池,因此它不会降低它的有用性
请注意,在C#5中,我通常使用async
/wait
支持,并使用超时来处理此问题<代码>任务。延迟
可以用来简单地处理这个问题,或者你可以在任何任务
上创建一个队列来处理超时问题。这在博客文章中非常明确地提到“它可以将一个工作项排队以阻止句柄,但最终会为每个这样的调用烧掉一个线程池线程。相反……”,我很高兴地发现,在阅读这篇文章之前,我正确地理解了这件事。