异步网络操作永远不会完成

2023-11-20

我有几个异步网络操作,它们返回可能永远不会完成的任务:

  1. UdpClient.ReceiveAsync不接受CancellationToken
  2. TcpClient.GetStream返回一个NetworkStream这不尊重CancellationToken on Stream.ReadAsync(仅在操作开始时检查取消)

双方都等待一条消息may永远不会来(例如由于数据包丢失或无响应)。这意味着我有phantom永远不会完成的任务、永远不会运行的延续以及暂停使用的套接字。我知道我可以使用TimeoutAfter,但这只能解决连续性问题。

那我该怎么办呢?


所以我做了一个扩展方法IDisposable这创造了一个CancellationToken超时后处理连接,因此任务完成并且一切继续:

public static IDisposable CreateTimeoutScope(this IDisposable disposable, TimeSpan timeSpan)
{
    var cancellationTokenSource = new CancellationTokenSource(timeSpan);
    var cancellationTokenRegistration = cancellationTokenSource.Token.Register(disposable.Dispose);
    return new DisposableScope(
        () =>
        {
            cancellationTokenRegistration.Dispose();
            cancellationTokenSource.Dispose();
            disposable.Dispose();
        });
}

而且使用方法也极其简单:

try
{
    var client = new UdpClient();
    using (client.CreateTimeoutScope(TimeSpan.FromSeconds(2)))
    {
        var result = await client.ReceiveAsync();
        // Handle result
    }
}
catch (ObjectDisposedException)
{
    return null;
}

额外信息:

public sealed class DisposableScope : IDisposable
{
    private readonly Action _closeScopeAction;
    public DisposableScope(Action closeScopeAction)
    {
        _closeScopeAction = closeScopeAction;
    }
    public void Dispose()
    {
        _closeScopeAction();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步网络操作永远不会完成 的相关文章

  • NHibernate 中的无状态会话初始化关联实体或集合失败

    我正在尝试与第 3 方 dll 中的实体建立关联 由于某些原因 我必须使用StatelessSession With StatefullSession它可以工作 但不适用于无状态 这个想法是允许第三方添加一个表并在我查询主表时获取其数据 我
  • 自定义代码访问安全属性

    我创建了以下属性 Serializable AttributeUsage AttributeTargets Class AttributeTargets Method AllowMultiple true Inherited true pu
  • ASP.net C#,采用不同参数类型的同名方法[重复]

    这个问题在这里已经有答案了 可能的重复 可以在 ASP Net MVC 中重载控制器方法吗 https stackoverflow com questions 436866 can you overload controller metho
  • C# 返回一个数的倍数和余数?

    我想找到给定数字的 3 的所有倍数 并找到余数 例如 给定数字 10 3 的倍数 3 6 9 余数 1 给定数字 11 3 的倍数 3 6 9 余数 2 到目前为止我的算法 但不是代码 是这样的 检查 X 是否是 3 的倍数 是 返回倍数
  • Q风格所有权

    在 Qt 应用程序中使用样式时 我遇到了一个有趣的问题QStyle所有权 QStyle继承自QObject 通常接受QObject parent作为构造函数参数来管理其子级的生命周期 但QStyle的构造函数没有此构造函数参数 第一个问题
  • decltype 中的可变参数模板包

    我可以写为 template lt class T0 gt struct Last0 using type decltype T0 OK compiles type T0 template lt class T0 class T1 gt s
  • 忽略 Entity Framework 6 中除部分属性外的所有属性

    我想使用实体框架在数据库中保留一些数据 我有一些更大的 POCO 但我只想存储一些属性 我知道我可以通过Fluent API通过使用Ignore 方法 但是是否也有可能不仅忽略已定义的属性 而且还忽略除已定义属性之外的所有属性 所以如果你有
  • 在聚合初始化期间,是否定义了从后来的成员表达式引用早期成员的行为?

    考虑以下 struct mystruct int i int j int main int argc char argv mystruct foo 45 foo i std cout lt lt foo i lt lt lt lt foo
  • 为什么 -1 >> 1 和 0xFFFFFFFF >> 1 会产生不同的结果?

    我正在尝试做一个测试来判断我的电脑是否通过右移十六进制执行算术右移或逻辑右移FFFFFFFF by 1 我知道一个整数 1读作FFFFFFFF十六进制 因为它是二进制补码1 右移 1 by 1结果是FFFFFFFF并显示 PC 执行算术右移
  • 组合 lambda 表达式以检索嵌套值

    我正在尝试创建表达式来访问嵌套结构中的字段或属性 我设法为平面对象上的字段和属性创建 getter 和 setter 作为 lambda 表达式 它的工作原理如下 Delegate getter getGetterExpression ob
  • 如何访问 OpenSSL 的 EVP_PKEY 结构中的原始 ECDH 公钥、私钥和参数?

    我正在使用 OpenSSL 的 c 库生成椭圆曲线 Diffie Hellman ECDH 密钥对 遵循第一个代码示例here http wiki openssl org index php Elliptic Curve Diffie He
  • 条件运算符 + 向上转换 + const 引用

    灵感来自这个问题 https stackoverflow com questions 23049166 我尝试了以下代码 struct A virtual void doit const 0 struct B public A virtua
  • 如何获取正在访问 ASP.NET 应用程序的当前用户?

    为了获取系统中当前登录的用户 我使用以下代码 string opl System Security Principal WindowsIdentity GetCurrent Name ToString 我正在开发一个 ASP NET 应用程
  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字

随机推荐

  • Woocommerce Rest API v2 中用户登录/注册的端点

    我已在 Woocommerce REST API 文档中完全搜索了用户登录 注册的端点 但无法找到它 谁能给我提供端点及其文档的链接 您可以通过多种方式实现这一目标 第一种方法是 它不仅适用于 WooCommerce 也适用于所有 Word
  • 使用 ADO.NET 实体框架从表中存在的值生成枚举

    我的要求是根据数据库表中存在的值创建一个枚举 我正在使用 ADO NET 实体框架模型 edmx 文件 你们中的任何一位都可以帮助我吗 使用 T4 模板可能要容易得多 这是一篇关于入门的非常好的文章 我下面的示例使用直接 SQL 连接 但正
  • 如何实现 ag-grid 行编辑的验证规则

    我目前有一个带有内联编辑的 html 表 它使用普通的 Angular Reactive Forms 包括很多验证规则 var formArray new FormArray this items map createItemFormGro
  • 如何将对象上下文传递给 jQuery.ajax JSONP 回调?

    当 ajax 提供程序预定义其回调时 我在将 javascript 对象上下文传递到 JSONP ajax 请求的回调处理程序时遇到问题 Flickr 是服务提供商 我将举一个简化的例子 function Person anId this
  • 无法对基本类型 char 调用 equals(char)

    我是编程新手 并试图完成一个基本的猜谜游戏 但我遇到了这个错误 需要一些帮助 因为我已将 猜测 设置为char 然后想将它与字符数组进行比较 但尝试了几种不同的方法 但还没有任何乐趣 它给了我底部 if 语句的错误 其中包含 guess e
  • 导入语句中的“show”和“as”有什么区别?

    有什么区别show and as在进口声明中 例如 有什么区别 import dart convert show JSON and import package google maps google maps dart as GoogleM
  • 获取每个二维数组的累积计数

    我有一般数据 例如字符串 np random seed 343 arr np sort np random randint 5 size 10 10 axis 1 astype str print arr 0 1 1 2 2 3 3 4 4
  • Xcode 6 中未创建 Swift to Objective-C 标头

    我最近一直致力于将 Swift 添加到现有项目中 以便以现实世界的方式进行尝试 将 Swift 源文件添加到项目后 我在获取 桥接头 即 Objective C 到 Swift 方面没有任何问题 But the Swift h应该公开 Sw
  • 没有记录的 Linq to Sql Sum

    我正在创建一种收集整个月累计总数的方法 问题是给定月份的某些项目可能不收费 因此不会返回任何行 我可以看到在没有数据的情况下这会如何出错 double fuelCost double from a in db EquipmentFuelLo
  • Django 脆皮表单不加载 CSS

    我在SO上看到这个问题 Django Cripy Forms 找不到 CSS 并遵循已接受答案中的所有建议 即 crispy forms 列在 INSTALLED APPS 下 我没有运行生产服务器 所以我不确定是否应用了collectst
  • 如何通过索引提取c#中字符串中的特定字符[重复]

    这个问题在这里已经有答案了 在 C 中 字符串就像数组 当您编写 str i 时 您可以在其中访问数组的 i 1 元素 类似于 C 中的内容 我不需要 indexOf 方法 因为这是不同的 我需要一些东西通过索引将字符带入字符串中 是的 您
  • 启动时将参数传递给 pyqt 线程

    当线程启动 start 时 有什么方法可以将参数传递给 QThread 吗 我在 stackoverflow 中找到了一个使用 pyqt 线程的示例 但我想知道如何传递参数 以防我希望工作线程处理我传递给其 run 函数的数据 我参考的帖子
  • 在应用程序中将 Youtube 视频保存到 iPhone

    在应用程序中播放 Youtube 视频非常简单 并且有详细的文档记录 这样做有两个问题 关闭 Youtube 播放器后 如果用户想再次播放 则必须再次等待在线流媒体 无法离线播放 在家加载视频以便在路上观看 有没有人有代码 下载 Youtu
  • 为什么使用 -lpthread 隐式声明 pthread_yield 而使用 -pthread 则一切正常?

    我在 CentOS7 中使用 gcc 编译此代码 main c include
  • 403 禁止回复 – 我应该寻找什么?

    我有一个脚本给我错误403 Forbidden error 它只是另一个脚本的副本 但不同之处在于两者都使用另一个 mysql 类来访问数据库 我的整个项目已完成 这是最后一个文件 因此我不想为单个文件再次完成整个工作 服务器日志显示客户端
  • 检查字符串是否由唯一字母组成的最简单方法?

    我需要在 Java 中检查一个单词是否由唯一字母组成 不区分大小写 由于直接解决方案很无聊 我想出了 对于字符串中的每个字符检查是否indexOf char lastIndexOf char 将所有字符添加到HashSet并检查设置大小是否
  • 使用 Qt 4.8 在全屏模式下隐藏光标?

    我在带有 OpenBox 的 ArchLinux 中 我想在 Qt 4 8 应用程序中隐藏全屏光标 我知道有关它的其他一些问题 但没有人每次都能工作 有时光标隐藏 有时不隐藏 我没能准确地理解问题发生的时间 但我认为这可能与屏幕保护程序有关
  • 如何在 Android 中重新启动 Activity? [复制]

    这个问题在这里已经有答案了 在我正在编写的应用程序中 有一部分可以让您更改窗帘设置 问题是 在重新创建活动之前 此设置不会生效 有没有办法告诉应用程序使用 onResume 方法重新启动 希望允许它保存 onSaveInstanceStat
  • 我们如何使用 POI API 读取受保护的密码 excel 文件 (.xls)

    我刚刚学习了 POI 发现 HSSF 的读取和创建 excel 文件 xls 非常简单 但是 当我想读取受密码保护的Excel时 我发现了一些问题 我花了一个小时在互联网上找到这个解决方案 请你帮我解决这个问题 如果您能给我一个代码片段 我
  • 异步网络操作永远不会完成

    我有几个异步网络操作 它们返回可能永远不会完成的任务 UdpClient ReceiveAsync不接受CancellationToken TcpClient GetStream返回一个NetworkStream这不尊重Cancellati