.NET 4.5 SslStream - 取消异步读/写调用?

2023-12-15

有没有办法取消 SslStream 上的异步读取或写入任务?我尝试为 ReadAsync 提供 CancellationToken 但它似乎不起作用。当以下代码达到超时(Task.Delay)时,它会调用 CancellationTokenSource 上的取消,should取消读取任务,向调用方法返回错误,并且调用方法最终尝试再次读取,这会引发“当另一个写入操作挂起时无法调用 BeginRead 方法”异常。

在我的特定应用程序中,我可以通过关闭套接字并重新连接来解决此问题,但建立连接会产生很高的开销,因此不太理想。

    private async Task<int> ReadAsync(byte[] buffer, int offset, int count, DateTime timeout)
    {
        CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

        if (socket.Poll(Convert.ToInt32(timeout.RemainingTimeout().TotalMilliseconds) * 1000, SelectMode.SelectRead) == true)
        {
            Task<int> readTask = stream.ReadAsync(buffer, offset, count, cancellationTokenSource.Token);

            if (await Task.WhenAny(readTask, Task.Delay(timeout.RemainingTimeout())) == readTask)
                return readTask.Result;
            else
                cancellationTokenSource.Cancel();
        }
        return -1;
    }

查看文档SslStream,它不支持ReadAsync(它只是使用后备同步实现Stream)。由于 SslStream 是一个装饰器 Stream,因此如何安全地从底层 Stream 的超时中恢复并不明显,唯一明显的方法是重新初始化整个 Stream 管道。然而,考虑到底层流可能不可查找,这也可能不是一个主意。

为了支持取消,流必须重写Stream.ReadAsync(Byte[], Int32, Int32, CancellationToken)。在文档中,两者都没有NetworkStream nor SslStream覆盖超载ReadAsync需要消耗取消(和abstract Stream不可能实现通用取消)。有关支持取消的示例,请参阅文件流并对比文档的不同之处。

所以对于一个具体的例子来说,如果我们要装饰HttpStream using SslStream然后超时后我们希望通过打开来恢复HttpStream回到我们超时的位置(使用Range标题)。但没有办法一般地使用IO.Stream class.

最后你应该考虑你的失败案例应该是什么。为什么会ReadAsync暂停?在我能想到的大多数情况下,这应该是由于不可恢复的网络问题,这需要Stream正在重新初始化。

加分点。您是否考虑过将超时行为重构为装饰器流?然后,您可以将超时装饰器放置到底层流上。

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

.NET 4.5 SslStream - 取消异步读/写调用? 的相关文章

  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 将 System.Windows.Forms.Keys 序列转换为 Char

    有没有办法转换由 Keys 枚举表示的击键序列 即System Windows Forms Keys 在一个字符中 例如 Keys Oem4进而Keys A产生 char 它一定存在于 WinAPI 中的某个地方 因为当我在文本框中按下按键
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • 通过 HTML/css 关闭 Chrome/Safari 拼写检查 [重复]

    这个问题在这里已经有答案了 有没有办法对于网络开发人员关闭特定的 Chrome Safari WebKit 拼写检查input or textarea元素 我的意思是通过特殊的标签属性或专有的 CSS 指令 有一个CSS指令可以关闭大纲in
  • Visual Studio 2015 社区 Xamarin 跨平台模板缺失

    我使用 Xamarin 安装了 Visual Studio 2015 Community Update 3 更新了 Xamarin 一切正常 但突然 当我尝试创建新项目时 Xamarin 跨平台模板丢失了 我不再有这些模板了 我只有这些 我
  • 将复杂的字符串解析为日期时间

    有人可以告诉我应该如何将以下格式转换为正确的格式DateTime object 11 50 46 AM on Wednesday October 19 2011 string s 11 50 46 AM on Wednesday Octob
  • C# 运行程序并获取运行后的环境变量

    我尝试使用 C 运行两个批处理脚本 然后查看它们如何影响环境 我的代码是 string finalEnvVarsFile Path GetTempFileName string arguments string Format c 0 1 s
  • Git 子树。为什么我不能从子树而不是根开始分支?

    我正在努力尝试理解使用 Git 子树策略 我的目的是将一些不同的存储库整合到一个伞形存储库下的一个玩具存储库小家族中 我正在使用此处详细介绍的子树策略 http help github com subtree merge 我正在绞尽脑汁地试
  • 由用户重命名的按钮

    我在编写某些按钮时遇到问题 这是我到目前为止所得到的 Public Class Form1 Dim Button 12 As Button Dim X As Integer Private Sub EventName Dim message
  • C++ 带权重的随机不重复整数

    我想有效地生成 封闭 范围内唯一 非重复 整数的随机样本 0 rnd max 范围内的每个数字都可以选择 并且每个数字都与样本权重相关联 权重越大 选择该数字的可能性就越大 概率恰好weight i sum weight not taken
  • @property 和 @synthesize 在 Objective-C 中的用途是什么?

    有什么用 财产 and 合成 您能举个例子解释一下吗 非常简短的答案 他们为 ivars 创建访问器 有维基百科上的一些例子 看看那些
  • Matlab:是否有一个函数可以定位数字中的“n”位(即“75673”中的第二位数字,所以5)

    我有一个号码A 7654321 我需要位置 5 处的数字 从开头算起 或从末尾算起的数字 3 在本例中为 3 是否有一个函数可以执行以下操作 getdigit A n 其中 A 是数字 n 是我想要的数字的位置 我可以将数字转换为文本字符串
  • 仍然无法理解 ASP.NET 事件。他们有什么意义?

    也许我很慢 但我只是不明白为什么你会使用不是从实际操作 例如单击 派生的事件 当您只需调用方法时 为什么要经历创建委托和事件的繁琐工作呢 看起来 当您创建一个事件时 您所做的只是创建一种方法 让调用者通过一些复杂的过程来调用一个简单的方法
  • 如何将 ASP.NET 下拉列表 DataTextField 属性绑定到嵌套属性

    我想绑定DataTextFieldASP NET 下拉控件的属性到作为初始数据源的属性的对象的属性 我将如何完成这项特定任务 下拉数据源数据架构 public class A public string ID get set public
  • ajax请求后页面刷新

    好吧 我有一个简单的表格 仅包含一个text field 当我们点击提交时 写入文本字段的数据将存储在数据库中 通过ajax存储 ajax 工作正常并且数据已提交 但是页面会自动刷新并且 URL 包含输入字段的内容 我的表格
  • 我应该使用多个数据库吗?

    我即将使用 Ruby on Rails 创建一个应用程序 我想使用多个数据库 基本上是一个会计应用程序 每个用户都有多个公司 我想为每个公司创建一个数据库 我找到了这个帖子http programmerassist com article
  • Fiware - 上下文代理:NGSIv2 订阅问题

    我正在使用 Orion 上下文代理版本 1 2 0 我使用 NGSIv2 订阅了两个不同的 cygnus 0 11 和 0 13 如下 curl 172 21 0 23 1026 v2 subscriptions s S header Fi
  • 查找重复的图像文件

    我的硬盘中存储了大约 1 TB 的图像 这些是朋友和家人长时间拍摄的照片 从某种意义上说 这些图片中的许多都是重复的 相同的文件保存在不同的位置 可能也具有不同的名称 我想问是否有任何工具 实用程序或方法 我可以编写一个 来找出重复的文件
  • 如何使 rush 与我的 orionInstance 一起工作

    按照我之前的问题如何在 MapViewer 小部件中显示来自 OrionContextBroker 的实体我使用 Rush 配置了我的上下文代理实例 并且正在使用https ngsiproxy lab fi ware org作为 NGSI
  • 如何使用java并发编程的ExecutorService?

    我使用下面的代码在远程服务器上上传图像 当我使用下面的代码时 它会同时在远程服务器上上传所有图像 List
  • 排序功能未按预期工作

    我有一个对象数组 实际上是从后端获取的 现在我正在映射数据 并希望通过单击按钮按升序和降序对其进行排序 所以我创建了一个 onSort 函数 但它不起作用我预计 因为大写和小写问题存在 即使按字母顺序排列 最后显示小写 数字没有排序 还有另
  • 如何在单元格选择/取消选择时正确切换 UITableViewCellaccessoryType?

    我正在尝试切换配件类型当选择 取消选择表格单元格时 行为应该是 点击 gt 将accessoryType 设置为UITableViewCellAccessory复选标记 gt 再次点击单元格 gt 回滚到UITableViewCell 附件
  • .NET 4.5 SslStream - 取消异步读/写调用?

    有没有办法取消 SslStream 上的异步读取或写入任务 我尝试为 ReadAsync 提供 CancellationToken 但它似乎不起作用 当以下代码达到超时 Task Delay 时 它会调用 CancellationToken