Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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
C# WebClient.DownloadFileTaskAsync()是否从未实际超时?_C#_.net_Async Await_Webclient_Webclient Download - Fatal编程技术网

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。对内部同步操作进行超时是从外部无法完成的。