【发布时间】:2026-02-04 03:00:02
【问题描述】:
在异步前的日子里,人们想知道如何在 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() 方法是否以等效于无限超时值的方式执行?
【问题讨论】:
-
@SLaks 谢谢。忘记了“开源”选项。正在使用第三方反编译器。
标签: c# .net async-await webclient webclient-download