使用 NetworkStream.BeginRead 和 NetworkStream.EndRead 实现超时

2024-03-11

我编写了以下函数来实现超时功能NetworkStream的异步读取函数(BeginRead and EndRead)。在我注释掉该行之前它工作正常Trace.WriteLine("bytesRead: " + bytesRead);. Why?

private int SynchronousRead(byte[] buffer, int count)
{
    int bytesRead = 0;
    bool success = false;
    IAsyncResult result = null;

    result = _stream.BeginRead(
        buffer, 0, count,
        delegate(IAsyncResult r)
        {
            bytesRead = _stream.EndRead(r);
        },
        null);

    success = result.AsyncWaitHandle.WaitOne(_ioTmeoutInMilliseconds, false);

    if (!success)
    {
        throw new TimeoutException("Could not read in the specfied timeout.");
    }

    //If I remove this line, bytesRead is always 0
    Trace.WriteLine("bytesRead: " + bytesRead);

    return bytesRead;
}

以防万一您想知道,我必须这样做,因为我最终需要以 .Net Compact Framework 3.5 为目标,而它不支持NetworkStream.ReadTimeout and NetworkStream.WriteTimeout特性。


一个有趣的线程错误。 bytesRead 变量已赋值after等待句柄已发出信号。有两件事可能会出错:方法在赋值之前返回。或者线程读取过时的值,因为它们在 WaitOne() 调用之后没有内存屏障。 Trace 语句解决了这个问题,因为它延迟了主线程足够长的时间以允许写入变量。它有一个内部锁来确保缓存是一致的。

您将需要一个额外的 AutoResetEvent 来指示 bytesRead 变量已写入。

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

使用 NetworkStream.BeginRead 和 NetworkStream.EndRead 实现超时 的相关文章

  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • SSL/TLS/HTTPS 站点在 C#/.NET WebBrowser 控件中非常慢,但在 Internet Explorer 中则很好

    背景 我正在修改自动维基浏览器 http en wikipedia org wiki Wikipedia AutoWikiBrowser使用托管在安全服务器上的 MediaWiki 站点 我允许用户通过 C 应用程序中的 WebBrowse
  • 在 C++ 中将成对向量转换为两个独立向量的最快方法

    假设我有一个vector of pair
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • (const T v) 在 C 中从来都不是必需的,对吗?

    例如 void func const int i 在这里 const是不必要的 因为所有参数都是按值传递的 包括指针 真的吗 C 中的所有参数确实都是按值传递 这意味着无论您是否包含该参数 实际参数都不会改变const or not 然而
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul

随机推荐

  • 使用decode() 与正则表达式来转义该字符串

    我有以下字符串 我正在尝试找出转义它的最佳实践 该解决方案必须有点灵活 因为我从 API 接收此输入 并且我不能绝对确定当前的字符结构 n相对于 r 将永远是相同的 If it ain t broke don t fix it nWent
  • 创建实用程序类?

    我对 OOP 非常陌生 并且正在尽最大努力使事情严格基于类 同时使用良好的编码原则 我现在已经进入我的项目了 我有很多通用方法想要放入实用程序类中 有没有创建实用程序类的最佳方法 public class Utilities int tes
  • 删除不是 .isin('X') 的行[重复]

    这个问题在这里已经有答案了 抱歉 刚刚进入 Pandas 这似乎应该是一个非常直接的问题 我怎样才能使用isin X 删除行are in列表X 在 R 中我会写 which a in b 你有很多选择 整理一下上面的一些答案和接受这篇文章的
  • S3(亚马逊简单存储系统)存储价格是如何计算的?

    我不太确定这是否是解决这个问题的正确堆栈交换站点 但我发现没有更适合的站点 我计划在下一个项目中使用 S3 但我不确定存储的价格实际上是如何计费的 如果我只是使用 S3 来放入千兆字节的数据并且几乎从不删除数据 那么我不会有任何问题 但事实
  • iOS 中的 Facebook 发帖错误

    在这里 我尝试使用以下代码向 Facebook 添加帖子 FBAppCall appCall FBDialogs presentShareDialogWithLink urlToShare name Title caption nil de
  • VSTS + 八达通部署?为什么我看到很多 CI/CD 设置都同时使用?

    我是一名正在转向 DevOps 的开发人员 通过观察 我注意到许多开发商店已经开始使用 Octopus Deploy 和 Azure Devops Services AzDo 以前称为 VSTS 或者他们正在启动新项目来设置 devops
  • scanf() 在操作系统中如何工作?

    我一直想知道 scanf printf 在硬件和操作系统级别实际上是如何工作的 数据在哪里流动以及操作系统在这些时间里到底在做什么 操作系统进行哪些调用 等等 scanf 和 printf 是 libc C 标准库 中的函数 它们分别调用
  • Vue.js 如何设置 :id 前缀字符串?

    class tab title v on click tab v for tabTitle index in tabTitleList id index 我在 vue 社区中找到了这个示例 但在我的情况下 我希望我的 id 有一个前缀 而不
  • 如何让 css3 border-image 在 IE9 中工作?

    我正在使用 border image 它适用于除 IE 之外的所有浏览器 对于 IE 版本 7 和 8 我有 css3pie 它可以正常工作 但我一直没能找到任何插件让它在 IE9 中工作 有没有办法可以破解它 使其在 IE9 中也能工作
  • 自定义后退指示图像和 iOS 11

    我在我的应用程序中使用自定义后退按钮 这个自定义后退按钮是全局设置的 如下所示 UINavigationBar appearance backIndicatorImage UIImage named Back withRenderingMo
  • Flutter - 如何更改 AppBar 高度并对齐标题垂直中心?

    我需要更改我的 flutter 应用程序中的应用栏高度 我使用这段代码 Widget build BuildContext context return Scaffold appBar PreferredSize preferredSize
  • 了解 scipy.optimize.basinhopping 的输出

    我正在使用 scipy optimize basinhopping 来最小化函数 这是我得到的 Out 96 nfev 162178 minimization failures 2501 fun 4 4702905615653705 x a
  • 当我尝试通过“http://localhost/xampp/htdocs/index.html”打开 HTML 文件时,它说无法连接到 localhost

    我已经安装了 XAMPP 有一个htdocs文件夹及其内部index html文件 当我尝试通过浏览器打开它时http localhost xampp htdocs index html它说 无法连接到本地主机 怎么了 代替 http lo
  • 将Java游戏转换为Applet;无法加载图片

    所以我用 Java 做了一个相当大的游戏 我打算把它放在我的网站上 所以我把它搞乱了 把它变成了一个小程序 它启动并运行得很好 唯一的问题是它不会加载任何图片 这是我目前正在做的方式 请记住 这是一个 JPanel 扩展类 我在小程序类中创
  • Ruby 中的 class << self 习惯用法

    什么是class lt lt self do in Ruby 首先 class lt lt foo语法打开foo的单例类 eigenclass 这允许您专门化在该特定对象上调用的方法的行为 a foo class lt lt a def i
  • Python Gtk.Entry 占位符文本

    我有一个登录窗口 有两个 gtk Entry 对象 一个用于用户名 一个用于密码 我如何向条目添加一些幽灵文本 因此条目中写有 用户名 但如果您单击内部 文本就会消失 从 Gtk 3 2 开始 可以设置占位符文本 http develope
  • IPython shell 的换行问题

    如果我在 IPython 中运行了很长的一行 并尝试调用它 使用向上箭头 或在当前行的开头处退格 则它显示不正确 全部挤成一行 例如 在下面的会话中我写了很长的一行 1 输入了一个有点空白的行 2 然后向上箭头两次以获得print网上声明
  • 如何隐藏system()输出

    我正在 Windows XP 上工作 我可以通过调用自动执行 ssh 会话的 TCL 脚本 通过浏览器成功运行 system 命令 我还从脚本返回一个值 但是我的问题是脚本将整个 ssh 会话转储到浏览器中 我的 php 脚本如下所示 la
  • 下拉列表问题

    我遇到一个问题 IE 6 7 中的下拉列表的行为如下 可以看到下拉的width宽度不够 无法在不扩展整个下拉列表的情况下显示整个文本 但是在 Firefox 中 没有问题 因为它expands the width因此 这是我们在 IE 6
  • 使用 NetworkStream.BeginRead 和 NetworkStream.EndRead 实现超时

    我编写了以下函数来实现超时功能NetworkStream的异步读取函数 BeginRead and EndRead 在我注释掉该行之前它工作正常Trace WriteLine bytesRead bytesRead Why private