我如何知道 UdpClient 是否已关闭/处置?

2023-12-22

我通过通常的异步回调从 UdpClient 接收数据:

private void OnUdpData(IAsyncResult result)
{
    byte[] data = _udpReceive.EndReceive(result, ref _receiveEndPoint);

    //Snip doing stuff with data

    _udpReceive.BeginReceive(OnUdpData, null);
}

When I Close()主线程中的 UdpClient,回调按我的预期触发,但此时_udpReceive已被处置,我得到了ObjectDisposedException当我尝试打电话时EndReceive()。我期待得到一个空缓冲区。

处理这个问题的正确方法是什么?有没有成员UdpClient我可以在尝试使用它之前进行检查,或者这是将其全部包装在一个中的唯一方法try{}并抓住ObjectDisposedException?对于正常的结束来说,这似乎非常令人讨厌。


您可以执行此操作来检查其是否已处理。当 UdpClient 被释放时,Client 被设置为 null。

private void OnUdpData(IAsyncResult result)
{
    if (_udpReceive.Client == null)
        return;
    byte[] data = _udpReceive.EndReceive(result, ref _receiveEndPoint);

    //Snip doing stuff with data

    if (_udpReceive.Client == null)
        return;
    _udpReceive.BeginReceive(OnUdpData, null);
}

尽管因为您在单独的线程中关闭它,您可能最终会遇到竞争条件。最好只捕获 ObjectDisposeException 和 SocketException。

private void OnUdpData(IAsyncResult result)
{
    try
    {
        byte[] data = _udpReceive.EndReceive(result, ref _receiveEndPoint);

        //Snip doing stuff with data

        _udpReceive.BeginReceive(OnUdpData, null);
    }
    catch (Exception e)
    {
        //You may also get a SocketException if you close it in a separate thread.
        if (e is ObjectDisposedException || e is SocketException)
        {
            //Log it as a trace here
            return;
        }
        //Wasn't an exception we were looking for so rethrow it.
        throw;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何知道 UdpClient 是否已关闭/处置? 的相关文章

  • setContextProperty 和对象的 setProperty 之间的区别

    我现在真的很困惑 有什么区别 QQmlApplicationEngine engine engine rootContext setContextProperty myObject userData and object gt setPro
  • SharpZipLib - 将文件夹/目录添加到 zip 存档

    通过示例 我很好地掌握了如何提取 zip 文件 几乎在每个示例中 识别 ZipEntry 是否为目录的方法如下 string directoryName Path GetDirectoryName theEntry Name string
  • Accept() 是线程安全的吗?

    我目前正在用 C 语言为我正在做的课程编写一个简单的网络服务器 我们的一项要求是实现一个线程池来使用 pthread 处理连接 我知道我将如何粗略地执行此操作 在主线程中调用accept并将文件描述符传递给freee线程 但是我的朋友建议了
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 用户控件内所有控件均为空

    我有一个 UserControl 它使用 UserControl 以及其他控件 In the ascx文件我有以下代码
  • 访问“if”语句之外的变量

    我怎样才能使insuranceCost以外可用if陈述 if this comboBox5 Text Third Party Fire and Theft double insuranceCost 1 在 if 语句之外定义它 double
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 您可以在一个 Windows Azure 实例上部署多个 Web 应用程序吗?

    是否可以在一个 windows azure 小型计算实例中运行一堆 Web 应用程序 我正在考虑使用 Azure 作为放置一堆处于开发和非生产状态的项目 Web 应用程序 的地方 有些实际上已经被封存了 但我想在某个地方有一个活跃的实例 我
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • 特征密集稀疏矩阵乘积是线程化的吗?

    我知道稀疏密集产品是根据文档进行线程化的 https eigen tuxfamily org dox TopicMultiThreading html https eigen tuxfamily org dox TopicMultiThre
  • 在简单注入器中注册具有多个构造函数和字符串依赖项的类型

    我正在尝试弄清楚如何使用 Simple Injector 我在项目中使用了它 注册简单服务及其组件没有任何问题 但是 当组件具有两个以上实现接口的构造函数时 我想使用依赖注入器 public DAL IDAL private Logger
  • 允许使用什么类型的内容作为 C 预处理器宏的参数?

    老实说 我很了解 C 编程语言的语法 但对 C 预处理器的语法几乎一无所知 尽管我有时在编程实践中使用它 所以问题来了 假设我们有一个简单的宏 它扩展为空 define macro param 可以放入宏调用构造中的语法有哪些限制 调用宏时
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • TPL 数据流块下游如何获取源生成的数据?

    我正在使用 TPL Dataflow 处理图像 我收到处理请求 从流中读取图像 应用多次转换 然后将生成的图像写入另一个流 Request gt Stream gt Image gt Image gt Stream 为此 我使用块 Buff
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task

随机推荐

  • 如何使用 Apache Ant 提取文件名的一部分?

    我想从 Ant 脚本外部生成的文件名中提取版本号 外部构建工具 PDE 构建 创建以下形式的文件artifactid 1 2 3 201101010101 jar在一个众所周知的目录中 但我无法事先告知版本控制信息 我需要提取版本部分 1
  • 如何根据索引向量求和

    我有 3 个向量 一个和向量 一个贡献向量和一个值向量 我想根据它们的贡献向量对值向量进行求和 并将它们放在和向量中相应的索引中 一个例子是 A 0 0 sum vector B 0 0 1 1 contribution vector C
  • CodeBlocks、GCC:更改项目语言 c 和 c++?

    当我选择开始控制台项目时 它允许您选择 C 或 C 但一旦创建 我不知道如何更改它 另外 当您创建 Win32 GUI 应用程序时 它根本不提供该选项 并且其默认值为 C 哪里可以改成C 我多年来一直在寻找所有项目设置 将我的文件重命名为
  • OpenCart:如何创建全局变量?

    我正在尝试在 OpenCart 中创建两个全局变量 我基本上希望能够在我的任何 tpl files 我尝试过编辑 library system php并且config php通过增加 global1 test 在我的文件中 然而调用它 tp
  • CMake 中 OpenSSL Crypto 的静态链接

    我需要为 MIPS 设备制作交叉编译的 OpenSSL 我尝试按照文档进行操作 放OPENSSL USE STATIC LIBS为 true 并设置target link libraries到您需要的库文件 CMakeLists txt c
  • elasticsearch.ElasticsearchException:标语无效或丢失(OpenSearch)

    从 Elasticsearch 迁移到 AWS OpenSearch 后 通过调用 OpenSearch 时出现以下错误Elasticsearch Rest High Level Client elasticsearch Elasticse
  • 如何删除谷歌图表中的默认错误消息

    如何删除谷歌图表中显示的默认错误 如下所示 要删除谷歌错误 请听 error 图表或其他对象上的事件 当事件被触发时 使用google visualization errors removeError 这里 我故意造成错误 将其从googl
  • driver.manage.wait(long timeout) 和显式等待之间的区别

    谁能说出以下的区别 driver manage wait long timeout and WebDriverWait wait new WebDriverWait driver WAIT IN SECONDS 明确等待 了解我未来的参考
  • 匹配 uuid.uuid4().hex 生成的值的正确正则表达式是什么?

    如何验证某个值是否等于此代码生成的 UUID4 uuid uuid4 hex 它应该是一些正则表达式吗 由以下形式的 32 个字符长的字符串生成的值 60e3bcbff6c1464b8aed5be0fce86052 据我所知 Martijn
  • 创建资源文件以在 Qt Designer 中使用它

    我想向小部件添加背景图像 因此我需要一个资源文件 但我无法在 Qt Designer 中创建它 这是我所做的 从小部件中 我进入资源浏览器并单击 添加新文件 按钮 然后弹出一个新窗口 系统要求我指向 qrc 文件 但该文件不存在 而且我不知
  • Swift 元组到可选赋值

    我正在用 Swift 编写一些代码来学习该语言 这是我的基类 import Foundation class BaseCommand NSOperation var status Int nil var message String nil
  • 截断字符串,但删除字符串的中间而不是结尾

    我想出了这个函数 它将给定的字符串截断为给定的单词数或给定的字符数 以较短者为准 然后 在截掉字符数或字数限制之后的所有内容后 它会在字符串中附加一个 如何从字符串中间删除字符 单词并将其替换为 而不是用 替换末尾的字符 单词 这是我的代码
  • 自动滚动不适用于 vbox 布局

    我需要将表单面板居中对齐 所以我使用了vbox布局 使用后自动滚动不再像以前那样工作 代码如下 Usr VWPanel Ext extend Ext Panel id null rid null closable true autoScro
  • 无法访问类 jdk.xml.internal.JdkXmlUtils

    我正在更新 hybris SAP Commerce 2005 的旧公司实习生扩展 它是使用 API 的扩展 我不知道这个扩展有多少年了 然而 当将它应用到java 11时 我发现了这样的问题 Java 11 导入 javax xml ws
  • 编写 Jena 内置函数

    我正在尝试写一个耶拿内置 http jena apache org documentation inference RULEbuiltins从给定的算法返回一个值 然后与该值进行比较 例如 String rule exRule d rdf
  • 最好的 Python Cassandra 库/包装器? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 I found lazyboy https github com digg lazyboy and pycassa https github c
  • 需要密码才能禁用 Android 设备管理员

    我正在考虑一个具有设备管理员权限的安全应用程序 我想看看当用户尝试在 设置 gt 安全 gt 设备管理员 下以管理员身份取消选中该应用程序时 是否可能需要密码 这将增加一个障碍 不允许用户轻易卸载应用程序 因为他们首先需要从应用程序中删除管
  • PHP-解码 JSON

    我有以下脚本从 API 获取搜索结果 然后对数组进行切片并转储它 我在将 JSON 解码为数组时遇到问题 它返回Array 0 这是一个 WordPress 简码 以下是从 api 获取的 Json 示例 barcode 000015426
  • Java:如何获取xml节点路径

    我有以下 xml
  • 我如何知道 UdpClient 是否已关闭/处置?

    我通过通常的异步回调从 UdpClient 接收数据 private void OnUdpData IAsyncResult result byte data udpReceive EndReceive result ref receive