Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Task.Factory.FromAsync和RegisterWaitForSingleObject-不';后者不会扼杀前者的效用吗?_.net_Multithreading_Asynchronous_Io_Timeout - Fatal编程技术网

.net Task.Factory.FromAsync和RegisterWaitForSingleObject-不';后者不会扼杀前者的效用吗?

.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

该问题可通过MSDN的以下引用来描述:

在异步方法期间,CommandTimeout属性将被忽略 调用BeginExecuteReader等

在谷歌上搜索这个问题的解决方案,我偶然发现了一些帖子,建议将
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
支持,并使用超时来处理此问题<代码>任务。延迟
可以用来简单地处理这个问题,或者你可以在任何
任务

上创建一个队列来处理超时问题。这在博客文章中非常明确地提到“它可以将一个工作项排队以阻止句柄,但最终会为每个这样的调用烧掉一个线程池线程。相反……”,我很高兴地发现,在阅读这篇文章之前,我正确地理解了这件事。