支持异步操作并遵守超时的.NET TcpClient/NetworkStream 实现

2024-04-15

根据问题数量、论坛帖子等,BCL 中的 TcpClient/NetworkStream 实现似乎缺乏对取消 IO 操作的适当支持。随着 .NET 4.5 中添加异步方法,这种取消(或适当的超时支持)的缺乏使事情变得更加令人沮丧,因为在执行 IO 时取消拒绝监视其 CancellationToken 的任务变得更加复杂(几乎不可能) 。

我见过许多实现,它们会启动额外的线程来监视网络操作,并在出现问题时关闭底层流。在我们试图通过使用异步操作来节省这些资源的世界中​​,这感觉非常肮脏。

任何人都可以为我指明处理有效取消/超时网络 IO 操作的指导方向,或者指向实际有效的强大的第 3 方实现吗?


取消 IO 并不是一件小事。从 Vista 开始,我们有了 CancelIO 功能,但这是一个相当新的东西,驱动程序需要支持它。

实际上,您能做的最好的事情就是关闭套接字以取消一切。或者,您可以围绕任务实现一个包装函数,以便在设置 CancellationToken 时立即完成。 IO 操作仍将继续,但其结果将被丢弃。

以下是有关该问题的彻底讨论:http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187 http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187

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

支持异步操作并遵守超时的.NET TcpClient/NetworkStream 实现 的相关文章

  • 阻止 Outlook 将 HTML 转换为 RTF

    我正在为 Outlook 2007 编写一个加载项 一切正常 除了当我以 HTML 格式发送电子邮件时 Outlook 将其转换为 RTF 因此 如果收件人在例如中打开它 Thunderbird 他收到的是一条看起来很奇怪的短信 而不是我发
  • C# 可以扩展数组吗?

    我习惯向 IEnumerable 等外部类添加方法 但是我们可以在 C 中扩展数组吗 我计划向数组添加一个方法 将其转换为 IEnumerable 即使它是多维的 不相关如何在 C 中扩展数组 https stackoverflow com
  • 将 .NET P/Invoke 代码组织为 Win32 API 的最佳实践

    我正在 NET 中重构一个大型且复杂的代码库 该代码库大量使用 P Invoke to Win32 API 该项目的结构不是最好的 我发现 DllImport 语句遍布各处 经常为同一函数重复 并且还以多种方式声明 导入指令和方法有时声明为
  • 使用 ITextsharp 将 Html 导出为 PDF

    我已经尝试了下面的代码 我也遇到了错误 我正在使用最新的 DLL String strSelectUserListBuilder h1 My First Heading h1 p My first paragraph p String ht
  • 改变方法中的结构

    如何更改外部方法中的结构 public void ChangeStruct MyStruct myStruct myStruct field1 10 return 当我在该方法之后将结构传递给 ChangeStruct 方法时 我希望更改
  • 如何查找局域网中所有主机上正在运行的程序的所有实例?

    出于实际目的 SqlDataSourceEnumerator 的作用是查找在 LAN 上的各个 PC 上运行的 SQL Server 的所有实例 是否有等效的方法可以查找任意应用程序的运行实例 编辑 好的 所以这只有效 因为这些应用程序有预
  • 在调试模式下单步执行时跳过方法的属性

    是否有一个属性可以在方法上使用 以便在调试模式下单步执行某些代码时 调试器保持在方法的外部 DebuggerStepThrough docs https learn microsoft com en us dotnet api system
  • 字典 API(词汇)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道一个好的 NET 字典 API 吗 我对含义不感兴趣 而是我需要能够以多种不同的方式查询单词 返
  • System.Drawing.Image.Save 抛出ExternalException:GDI 中发生一般错误

    我有一个函数 它需要一个位图 复制它的一部分并将其保存为 8bpp tiff 结果图像的文件名是唯一的并且文件不存在 程序有权写入目标文件夹 void CropImage Bitmap map Bitmap croped new Bitma
  • IL 的仿制药?

    是否可以在 IL 生成器中使用泛型 DynamicMethod method new DynamicMethod GetStuff typeof int new Type typeof object ILGenerator il metho
  • 实用程序库中应包含哪些内容[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 随着我的项目越来越多 我发现我经常从一个项目到另一个项目 从一个客户到另一个客户重复许多常见的任务 因此 我开始组装一个 实用程序 库 这是这些
  • DotNET 应用程序中的 GDI 句柄

    我的纯 DotNET 库作为非托管桌面应用程序中的插件运行 我收到了稳定的 虽然低 崩溃报告流 这些报告似乎表明 GDI 句柄存在问题 错误消息中的字体等 恢复为系统字体 各种控件的显示崩溃 不久后发生大规模崩溃 我的窗体几乎没有控件 但我
  • Java有没有类似微软CHESS的工具?

    是否有类似于 Microsoft 的现有 Java 工具CHESS http research microsoft com chess 或者 CHESS 源代码是否开放 以便我可以尝试将其转换为 Java 谷歌的织线工 http code
  • Sitecore - 隐藏功能区中的按钮

    我为特定内容项创建了上下文功能区 我有两个按钮 可以将项目 升级 或 降级 到某一类别 该部分只能有一个 是否可以根据某种隐藏代码中的内容状态隐藏其中一个按钮 我了解如何链接到 Click 事件 但我想知道是否有某种加载事件可供自定义功能区
  • 如何获取Winforms窗体标题栏高度的大小?

    因此 如果它是工具窗口或可最小化的表单 我希望能够以编程方式获取其高度 这可能吗 如果是这样怎么办 您可以使用以下方法确定工具窗口和普通表单的标题栏高度 Rectangle screenRectangle this RectangleToS
  • “你好世界!!”在 .NET 4 中生成 3500 个页面错误

    我正在运行 Windows Vista 和 Visual Studio 2010 使用 NET 4 2 GB RAM 和大约 800 MB 可用空间 我创建了一个 Windows 窗体应用程序 但没有向其中添加任何代码 只需在发布模式下编译
  • 使用.Net/C# 计算集合的频率分布

    是否有一种快速 简单的方法来使用 Linq 或其他方式计算 Net 集合的频率分布 例如 任意长的 List 包含许多重复项 遍历列表并计算 跟踪重复次数的巧妙方法是什么 查找列表中重复项的最简单方法是将其分组 如下所示 var dups
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 引用的程序集自动由 Visual Studio 替换

    我有 2 个项目 一个可移植类库和一个常规单元测试项目 在可移植类库中 我使用 NuGet 来引用 Microsoft BCL 可移植包 它附带 2 个程序集 System Threading Tasks dll and System Ru
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况

随机推荐

  • 如何跟踪 celery 中的重试次数

    在 Celery 中 如何跟踪当前的重试 我知道我可以做这样的事情 app task bind True default retry delay 900 max retries 5 def send email self sender No
  • 活动开启两次

    我有一个使用的应用程序城市飞艇 http urbanairship com 用于推送通知 当通知到达并且用户单击它时 我的应用程序中的活动 A 应该打开并执行某些操作 我已经安装了BroadcastReceiver如图所示在文档中 http
  • 在 C++ 中将数组转换为集合

    有没有更简单的方法使用 C 将数组转换为集合而不是循环遍历其元素 最好使用标准模板库 对于所有标准库容器类型 请使用构造函数 http en cppreference com w cpp container set set std set
  • ASP.NET Owin OAuth (Google / Facebook) 正在重定向到默认的 login.aspx,而不是远程登录页面

    我正在使用 Owin 库 包括 Google 和 Facebook 设置 OAuth 从表面上看 Owin 启动课程注册得很好 我发现我没有被重定向到 Facebook 或 Google 的相应登录页面 而是被重定向到默认的 login a
  • 从 SDK 上的“getLastKnownLocation”获取 null

    我有一个与位置 API 相关的问题 我尝试了以下代码 LocationManager lm LocationManager getSystemService Context LOCATION SERVICE Location loc get
  • 避免 D3.js 中子节点重叠

    我正在使用 D3 js 构建一个树结构 显示 Facebook 用户和他 她的 Facebook 好友 根节点是用户 子节点是好友 我的 UI 中有固定宽度 问题是子节点将相互重叠 var nodes tree nodes root rev
  • 使用 Resharper 7 测试运行程序进行 Jasmine 测试的堆栈跟踪

    如何让 Resharper 7 测试运行程序显示 Jasmine 测试的堆栈跟踪 我的设置是 Resharper 7 在 Jasmine 中构建 测试运行器和 PhantomJs 执行任何失败的测试时 错误消息始终以以下内容结尾 Excep
  • jquery-ui - 取消拖动转义键

    我有一个可拖动的列表divs 和一个可放置区域 在 chrome FF 和 IE9 中 鼠标拖放功能运行良好 我想添加键盘交互 拖拽div使用按键时应恢复到列表esc钥匙 所以首先我这样做了 document keyup function
  • ng-grid 行模板中的日期格式

    我创建了一个具有以下列定义的 ng grid columns field CompanyPkid visible false field CompanyName visible false field StartDate visible f
  • 如何让用户能够使用我的应用程序播放视频?

    昨晚刚刚花了几个小时为 Honeycomb 开发了一个非常漂亮的视频播放器 现在我当然希望人们能够使用它 如何让我的应用程序监听 接收 视频播放广播 我猜这与manifest xml文件 但我无法在 Android 开发者网站上找到任何有关
  • 然后 Groupby 检查行匹配并计算该值的并发实例数

    我有这个数据框 car color years max years 0 audi black 1 7 1 audi blue 2 7 2 audi purple 4 7 3 audi black 6 7 4 bmw blue 1 5 5 b
  • 为什么 CAS(原子)操作比同步或易失性操作更快

    据我了解 synchronized关键字将本地线程缓存与主内存同步 volatile 关键字基本上总是在每次访问时从主内存中读取变量 当然 访问主内存比本地线程缓存要昂贵得多 因此这些操作的成本很高 然而 CAS 操作使用低级硬件操作 但仍
  • 有条件的 Mercurial 忽略文件

    我在 Mercurial 中有一个文件 我希望开发机器提取该文件 但我希望部署服务器不提取该文件 它具有开发机器没有的特殊模块 这是可能的 还是我应该有一个自定义的推送到服务器解决方案 而不是仅仅进行 hg pull 执行此操作的典型方法是
  • H2O R api:从网格搜索中检索最佳模型

    我正在使用h2oR 中的包 v 3 6 0 并且我构建了一个网格搜索模型 现在 我正在尝试访问最小化验证集上的 MSE 的模型 在Python中sklearn 这在使用时很容易实现RandomizedSearchCV Pseudo code
  • 如何将 Windows 桌面应用程序转换为 Mac 桌面应用程序?

    我需要将 C NET Windows 桌面应用程序转换为 Mac 我读过有关 Qt REAL Studio LiveCode RunRev wxWidgets 和 Mono 的跨平台方面的内容 www mono project com 和h
  • 如何使用 Maven 在构建时正确增强类? OpenJPA

    我在尝试着enhance 实体 类 所以我不会得到这个异常 Exception in thread main
  • CGImageRelease:[不是类型发布]:发送到已释放实例的消息

    我在代码 CGImageRelease imageToSave 的最后一行收到此错误 不是类型发布 消息发送到已释放的实例 请解释原因以及我需要使用什么来修复它 我正在使用 ARC 但我认为这不适用于 CG 对象 在测试代 码是否有效后 我
  • 地理编码器可使用两个地址

    带有 Geocoder gem 的 Rails 4 1 3 应用程序在模型上具有以下属性 t decimal origin lon precision gt 15 scale gt 10 t decimal origin lat preci
  • C# Ghostscript 包装器

    有没有人遇到过 C 中 GhostScript 的一个很好的包装器 我的具体用途是把postscript转成pdf Matthew Ephraim 创建了一个非常简单的 C 包装器 名为 GhostScriptSharp 它使用 P Inv
  • 支持异步操作并遵守超时的.NET TcpClient/NetworkStream 实现

    根据问题数量 论坛帖子等 BCL 中的 TcpClient NetworkStream 实现似乎缺乏对取消 IO 操作的适当支持 随着 NET 4 5 中添加异步方法 这种取消 或适当的超时支持 的缺乏使事情变得更加令人沮丧 因为在执行 I