编程语言
首页 > 编程语言> > c#-WebClient.DownloadFileTaskAsync()永远不会真正超时吗?

c#-WebClient.DownloadFileTaskAsync()永远不会真正超时吗?

作者:互联网

在异步之前的日子里,人们想知道如何在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()重写来设置一个非常小的超时值.当调用非异步方法时,它将引发超时异常,但在调用异步方法时,则不会引发超时异常.

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

有谁可以肯定地知道DownloadXyzTaskAsync()方法是否以等效的无限超时值执行?

解决方法:

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

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

因此,此(以及任何其他类型的)异步操作需要某些内容(即CancellationToken)才能超时.的确,该库可以在内部使用计时器,但是在.Net中很少这样做,因为这是意外的,您可以自己使用一个自取消的CancellationToken来实现.

因此,在这种特定情况下,通常,异步方法通常不受配置的超时影响. Socket,TcpClient,UdpClient等也是如此.

现在,如果您想从HttpWebRequest的实际代码中进行确认,您可以看到超时用于创建计时器队列here.该队列用于在GetResponse中创建超时计时器,但从未在BeginGetResponse中创建超时计时器.这是在DownloadXXXTaskAsync中使用的DownloadXXXAsync.

标签:async-await,webclient-download,webclient,c,net
来源: https://codeday.me/bug/20191119/2038908.html