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() 实际上永远不会超时吗? 的相关文章

  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • Apollo graphql 将标头设置为 authmiddleware 不起作用

    我正在使用react native和apollo客户端 如果我尝试通过存储在AsyncStorage中的jwt设置标头 它似乎不起作用 其他不需要标头的解析器工作得很好 我的代码如下所示 import ApolloClient from a
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐