C# WebClient.DownloadFileTaskAsync()是否从未实际超时?
在异步之前,人们想知道如何在C# WebClient.DownloadFileTaskAsync()是否从未实际超时?,c#,.net,async-await,webclient,webclient-download,C#,.net,Async Await,Webclient,Webclient Download,在异步之前,人们想知道如何在WebClient上设置超时,答案只是扩展基类,覆盖GetWebRequest()并在那里设置超时 protected override WebRequest GetWebRequest(Uri address) { // NOTE: this override has no affect if the Async methods are used!!! WebRequest request = base.GetWebRequest(address);
WebClient
上设置超时,答案只是扩展基类,覆盖GetWebRequest()
并在那里设置超时
protected override WebRequest GetWebRequest(Uri address)
{
// NOTE: this override has no affect if the Async methods are used!!!
WebRequest request = base.GetWebRequest(address);
((HttpWebRequest)request).Timeout = 20 * 60 * 1000;
((HttpWebRequest)request).ReadWriteTimeout = 20 * 60 * 1000;
return request;
}
假设人们需要更长的超时时间
然后,通过添加xyzTaskAsync()
方法,人们想知道如何设置超时,答案是使用由本地计时器驱动的CancellationToken
所以我猜假设是人们需要在给定的时间后结束请求
那么这是否意味着DownloadFileTaskAsync()
或DownloadStringTaskAsync()
自身从不超时?超时故障不是任何网络操作的固有部分吗
我使用了GetWebRequest()
override来设置一个非常小的超时值。它在调用非异步方法时引发超时异常,但在调用异步方法时不会引发超时异常
我已经反编译了System.Net库,但是异步方法似乎调用了一些缓存的匿名lambda,这些lambda不容易发现
有人肯定地知道下载xyztaskasync()方法执行时是否具有无限超时值吗?同步操作被阻塞,这意味着线程在某种等待句柄上被阻塞。这种等待可以是无限的(如果操作本身没有结束,那么这种等待是无限的),或者这种等待可以接收某种类型的超时,在这种超时之后,它将取消阻塞并超时 异步操作本质上是异步的,因此没有任何活动部分在做某些事情。没有线程被阻塞或任何类似的情况。这意味着,它本质上不可能在没有指示的情况下真正超时或取消,即使这样,操作也只是被放弃而不是取消。某个东西通常是
取消令牌
(超时后可能会或可能不会用计时器发出信号)
因此,这种(以及任何其他类型的)异步操作需要某种东西(即CancellationToken
)才能超时。的确,库可以在内部使用计时器,但在.Net中很少使用计时器,因为这是意外的,您可以使用自取消CancellationToken
自行完成
因此,在这种特定情况下,通常情况下,异步方法不会受到配置超时的影响。对于Socket
、TcpClient
、UdpClient
等,情况也是如此
现在,如果您想从
HttpWebRequest
的实际代码中确认,您可以看到超时用于创建计时器队列。该队列用于在中创建超时计时器,但从不在中创建。这是DownloadXXXAsync
中使用的异步选项,该选项在DownloadXXXTaskAsync
中使用,覆盖由TaskAsync
方法使用@沙拉谢谢。忘记了“开源”选项。正在使用第三方反编译器。感谢您指向我忘记的“开源”选项。(我使用的是第三方反编译器。)我看到了对计时器队列的引用,这就是我怀疑的原因,但我现在清楚地看到,异步版本的方法没有调用它。这将是一个全新的讨论,但作为旁注,我认为超时条件通常是网络协议固有的一部分,异步调用仍然必须遵守它。我想这是有意义的,因为它是一个客户端选项,而不是服务器驱动的。但它无处不在,不是吗。浏览器和下载客户端总是超时。@mdisibio在我看来,.Net的家伙只有在你自己不能(以合理的方式)完成的时候才给你一个API。对内部同步操作进行超时是从外部无法完成的。