WebClient.DownloadFileTaskAsync() 实际上永远不会超时吗?

2024-03-22

在异步之前的日子里,人们想知道如何设置超时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;
}

假设人们需要一个longer超时。

然后添加xyzTaskAsync()方法中,人们想知道如何设置超时,答案是使用由本地计时器驱动的 CancellationToken。

所以我猜假设人们需要在给定时间后结束请求。

So 这是否意味着 DownloadFileTaskAsync() or DownloadStringTaskAsync() 永远不会自行超时?超时失败不是任何网络操作的固有部分吗?

我用过GetWebRequest()覆盖以设置非常小的超时值。调用非异步方法时会抛出超时异常,但调用异步方法时不会抛出超时异常。

我已经反编译了 System.Net 库,但异步方法似乎调用了一些不易发现的缓存匿名 lambda。

有谁确切地知道如果DownloadXyzTaskAsync()方法以相当于无限超时值的方式执行?


同步操作是阻塞的,这意味着线程被某种等待句柄阻塞。该等待可以是无限的(如果操作本身没有结束,则无限)或者该等待可以接收某种超时,之后它会解除阻塞并超时。

异步操作本质上是异步的,没有任何活动部分在做某事。没有线程被阻塞或类似的情况。这意味着它本质上不能在没有任何指示的情况下真正超时或取消,即使这样,操作也只是被放弃而不是被取消。那东西通常是CancellationToken(超时后可能会或可能不会用计时器发出信号)。

因此,这种(以及任何其他类型的)异步操作需要一些东西(即CancellationToken)能够超时。确实,该库可以在内部使用计时器,但在 .Net 中很少这样做,因为这是意外的,您可以通过自我取消来自己做到这一点CancellationToken.

因此,在这种特定情况下以及一般情况下,异步方法通常不会受到配置的超时的影响。情况也是如此Socket, TcpClient, UdpClient, etc.

现在,如果您想从实际代码中进行确认HttpWebRequest可以看到超时是用来创建定时器队列的here http://referencesource.microsoft.com/#System/net/System/Net/HttpWebRequest.cs,1017。该队列用于创建超时计时器GetResponse http://referencesource.microsoft.com/#System/net/System/Net/HttpWebRequest.cs,2212但从未在BeginGetResponse http://referencesource.microsoft.com/#System/net/System/Net/HttpWebRequest.cs,613ffcf7266252eb,references。这是使用的异步选项DownloadXXXAsync这是用在DownloadXXXTaskAsync.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebClient.DownloadFileTaskAsync() 实际上永远不会超时吗? 的相关文章

随机推荐