使用 HttpWebRequest.BeginGetResponse 实现超时的最佳方法

2023-12-30

HttpWebRequest.BeginGetResponse 不尊重 HttpWebRequest 的任何超时属性(Timeout 或 ReadWriteTimeout)。

我阅读了一些方法来获得相同的结果,但我不知道这是否是最好的方法,以及我是否应该使用几次调用,或者我可以在循环内扩展它(我正在做一个网络爬虫)。

重要的是,最初我的代码不是异步的,我只需要异步,因为我的方法应该接受 CancellationToken。

我关心的是 WaitHandles 和 ThreadPool.RegisterWaitForSingleObject。这不是日常代码,所以我不知道在不久的将来是否会遇到问题。

private static void HandleCancellation(HttpWebRequest request, IAsyncResult getResponseResult, CancellationToken cancellationToken)
{
    using (WaitHandle requestHandle = getResponseResult.AsyncWaitHandle)
    {
        ThreadPool.RegisterWaitForSingleObject(requestHandle, TimeoutCallback, request, request.Timeout, true);

        //If request finish or cancellation is called
        WaitHandle.WaitAny(new[] {requestHandle, cancellationToken.WaitHandle});
    }

    //If cancellation was called
    if (cancellationToken.IsCancellationRequested)
    {
        request.Abort();
        cancellationToken.ThrowIfCancellationRequested();
    }
}

调用(再次强调,它不是异步的)

IAsyncResult getResponseResult = request.BeginGetResponse(null, null);

HandleCancellation(request, getResponseResult, cancellationToken);

return (HttpWebResponse)request.EndGetResponse(getResponseResult);

参考:管理多个 WebRequest 的更好方法 https://stackoverflow.com/questions/6720113/better-approach-in-management-of-multiple-webrequest


MSDN 文档为开始获取响应 http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetresponse.aspx有一个关于如何处理超时的很好的例子。它在我的网络爬虫中对我来说非常有效。

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

使用 HttpWebRequest.BeginGetResponse 实现超时的最佳方法 的相关文章

  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内

随机推荐

  • 在 vim 中映射 Shift 键

    I m having an issue when mapping the Shift key in VIM I want Ctrl L to behave differently than Ctrl Shift L 所以我有这个 for i
  • 数据流管道和 pubsub 模拟器

    我正在尝试设置我的开发环境 我没有在生产中使用 google cloud pubsub 而是使用 pubsub 模拟器进行开发和测试 为了实现这一点 我设置了以下环境变量 export PUBSUB EMULATOR HOST localh
  • 蓝牙配对时未调用 BroadcastReceiver

    很简单 我唯一的代码是这样的 final BroadcastReceiver mReceiver new BroadcastReceiver Override public void onReceive Context context In
  • Python 集合.counter

    python新手 想知道如何告诉python第3行中的数据都是一个数字而不是单个数字 我正在使用 collections Counter 但它可能不是正确的 datafile csv Z4 29 Mar 13 Name 1 1234567
  • 使用 R markdown、knitr、pandoc、beamer 绘图大小和分辨率

    默认情况下不适合幻灯片 甚至不通过任何其他方式打印 这是 Rmd 编辑 看来你必须在每个块中使用plot 现在打印第二个图 Plot should show at high resolution r echo FALSE comment l
  • 如何在 php 中获取部分从 jquery 加载的页面的整个 html

    我这问题好几天了 我必须从 php 加载页面的整个 html 在此页面上有一个 jquery 函数 当所有页面加载完毕时会调用该函数 这个函数将其他html加载到页面中 所以我必须加载所有html 也加载了jquery的部分 我可以知道我得
  • 如何检测软键盘输入法是否覆盖整个屏幕?

    我正在创建一个应用程序 用户可以在其中单击选项卡 并且将以编程方式显示软键盘 但是 如果软键盘要覆盖整个屏幕 如提取的 EditText 我不想显示软键盘 如下所示 检测屏幕方向可能会有所帮助 但据我所知 在平板电脑上 即使在横向上 软键盘
  • 获取主干集合中属性不等于某个值的所有模型

    这取自 Backbone js 文档 var musketeers friends where job Musketeer 在那里你可以获得一系列工作平等的模型 那就是 火枪手 但我该如何做相反的事情呢 我怎样才能获得一系列工作不是 火枪手
  • 如何从 ListView 控件中的各个项目中删除复选框?

    我有一个 ListView 其中包含 名称 预期 总计 列 我想在末尾添加另一列 重新计数 理想情况下 仅当 预期 值大于 总计 值时 重新计数 列才会有一个复选框 到目前为止 我已经获得了带有列的 ListView 并且可以在左侧添加一个
  • Android 中的简单 XML 解析

    我的xml如下所示 lt sUID gt yPkmfG3caT6cxexj5oWy34WiUUjj8WliWit45IzFVSOt6gymAOUA lt sUID gt lt Shipping gt 0 00 lt Shipping gt
  • 使用 Angular cli 6 项目在 Chrome 工作区中处理组件 CSS 文件

    我正在尝试在 Angular 6 7 CLI 项目中使用具有 CSS 持久编辑功能的 Google Chrome 工作区 当在 angular json 配置中添加 extractCSS true 并使用 source map true 标
  • 检测点击外部元素?

    如同这个问题 https stackoverflow com questions 152975 how to detect a click outside an element 但更进一步 我想检测一组项目之外的点击 我按以下方式处理这些项
  • jQuery(或者可能是浏览器)是破坏缓存的ajax加载脚本

    我正在通过加载视图页面 ajax 使用 jQuery 调用 我明确将 缓存 选项设置为 true 我们在应用程序中没有任何地方使用 ajaxSetup 否则指定 这是 ajax 请求设置 viewDialogLink click funct
  • Chart.js - 如何在图表中间添加文本?

    我正在使用 Chart js 创建此折线图 但我需要标记区域 如下所示 有任何想法吗 您扩展您使用的图表 然后使用辅助方法编写标签 HTML
  • 如何转义 fopen 的 url

    看起来 fopen 无法打开带有空格的文件 例如 url http gatewaypeople com images articles cntrbutnssttmnts12 main 616x200 jpg fopen url r 返回 f
  • Jenkins作业运行系统Groovy脚本如何响应用户kill

    我有一个长时间运行的 System Groovy 脚本 它启动了数以万计的其他构建 为了不使构建队列过长 导致 UI 无法使用 它监视构建队列的长度 如果构建队列长于给定阈值 它将不会启动任何新构建并休眠一分钟 问题是 该脚本不响应用户终止
  • 使用 GTK 和 c++ 播放音频文件

    我目前正在使用 gtk 和 C 代码构建一个非常简单的音乐播放器 但现在我无法弄清楚如何使用 C 代码打开和播放音频文件 include
  • 添加苹果图标到网站

    我已经使用 Woorank 测试了我的网站 并显示了有关缺少 Apple 图标的警告 我已经搜索过 但我不确定如何包含这个图标 我找到了这段代码
  • “新”表达式中的大括号? (例如“new MyClass() { ... }”)

    大括号在那里做什么 handler1 new Handler public void handleMessage object new Class Name 这种语法只存在于 Android 或 Java 上吗 那么它在 Java 中又叫什
  • 使用 HttpWebRequest.BeginGetResponse 实现超时的最佳方法

    HttpWebRequest BeginGetResponse 不尊重 HttpWebRequest 的任何超时属性 Timeout 或 ReadWriteTimeout 我阅读了一些方法来获得相同的结果 但我不知道这是否是最好的方法 以及