在我的 C# 应用程序中,Thread.Start 在某些稀疏情况下不会返回

2024-02-15

我用 C# 编写了一个 TCP 服务器应用程序。应用程序侦听入站连接

在主侦听器线程中使用 TcpListener.AcceptTcpClient() 方法。

当收到连接时,TcpListener.AcceptTcpClient() 解除阻塞并返回 TCPClient 对象。

收到连接后,将创建一个新线程并开始向新连接读取写入数据。

新线程由以下代码启动。

while(true)
{
  TcpClient client = serverListener.AcceptTcpClient();


  if (client.Connected)
  {
    Thread t = new Thread(delegate() { readWriteData(client); });
    t.IsBackground = true;
    t.Start(); /// Problem happens here. The thread gets stuck here and doesn't move   further
  }
 }

该应用程序运行良好,但有时在 Windows 7 计算机中,该应用程序会突然停止侦听 tcp 连接。

分析该状态下的应用程序的线程堆栈(使用Microsoft stack explorer查看应用程序所有线程的堆栈)发现主侦听器线程卡在上面所示代码部分的以下行

 t.Start(); /// Problem happens here. The thread gets stuck here and doesn't move   further

我做了很多研究,但找不到为什么会发生这种情况。仅在 Windows 7 系统中观察到此行为。

有人可以帮我解决这个问题吗?

根据罗布的建议,

我在这里发布由windbg(sos)显示的堆栈跟踪

0547eae0 7282e006 mscorwks!Thread::StartThread+0xc3, calling mscorwks!_EH_epilog3
0547eb00 727ac825 mscorwks!__SwitchToThread+0xd, calling mscorwks!__DangerousSwitchToThread
0547eb10 728b9c6f mscorwks!ThreadNative::StartInner+0x1ba, calling mscorwks!__SwitchToThread
0547eb58 727e4b04 mscorwks!SafeHandle::DisposeNative+0x3a, calling mscorwks!LazyMachStateCaptureState
0547ebc8 728b9d80 mscorwks!ThreadNative::Start+0xa6, calling mscorwks!ThreadNative::StartInner
0547ec18 728b9d01 mscorwks!ThreadNative::Start+0x1f, calling mscorwks!LazyMachStateCaptureState
0547ec74 71de6afc (MethodDesc 0x71c13048 +0x8c System.Threading.Thread.Start()), calling mscorwks!ThreadNative::Start
0547ec8c 030e2a46 (MethodDesc 0x30da408 +0x25e WindowsService.Server.startListener()), calling (MethodDesc 0x71c13048 +0 System.Threading.Thread.Start())

我仍然没有找到上述问题发生的根本原因。但是,为了防止我的应用程序因这种情况而失败,我实施了以下解决方法。

修改后的代码如下。

count = 0;

while(true)
{
  TcpClient client = serverListener.AcceptTcpClient();


  if (client.Connected)
  {
    Thread t = new Thread(delegate() { readWriteData(client); });
    t.IsBackground = true;

    ++count;
    t.Start(); /// Problem happens here. The thread gets stuck here and doesn't move   further
    ++count;
  }

}

我检查另一个线程,如果 count 的值在 5 秒内没有改变,并且 count 的值是奇数,则意味着侦听器线程卡在 t.start() 上。在这种情况下,我终止当前的侦听器线程并启动新的侦听器线程。

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

在我的 C# 应用程序中,Thread.Start 在某些稀疏情况下不会返回 的相关文章

随机推荐

  • 覆盖期间 Azure Blob 可用性

    天蓝色的 blob 在被新版本覆盖时是否可供下载 根据我使用 Cloud Storage Studio 的测试 下载被阻止 直到覆盖完成 但是我的测试来自同一台计算机 因此我无法确定这是正确的 如果它在覆盖期间不可用 那么我认为解决方案 以
  • 在 mssql 上更新记录时,SqlAlchemy StaleDataError 返回 -1

    我在用着flask sqlalchemy更新mssql记录 但返回 1 库版本 SQLAlchemy 1 3 11 Flask SQLAlchemy 2 4 1 pyodbc 4 0 27 烧瓶1 1 1 代码第 1 部分 ret db s
  • iPhone X 状态栏高度

    我开发了一个应用程序 没有autoLayout or interface builder 全部通过代码 一切都运行正常iPhones except iPhone X顶部栏位于中间新的黑色物体下方 可以通过代码获得这个高度 所以我可以改变我的
  • CORS:Facebook 是否为其所有图片启用了 CORS?

    我在某处读到 Facebook 已经交叉启用了个人资料图片 我不确定相册和其他东西 但事实上 Facebook 包含了标题Access Control Allow Origin 到目前为止我测试过的每一个 URL 我尝试过标准的个人资料图片
  • 通过 C# 代码扩展 azure 函数

    我是 Azure Functions 的新手 我需要编写一些 C 代码来根据某些条件扩展 Azure Functions 例如 我总共有 10 个客户将调用 Azure Functions 但这10个中 有一个高优先级顾客 如果该高优先级客
  • pd.Series.prod() 函数

    这可能应该是基本的 但我仍然无法弄清楚 我正在阅读 pd Series 上的文档并做简单的练习 我的代码如下 import pandas as pd import numpy as np pd Series 2 4 6 prod Out 7
  • 空手道:遍历复杂的 JSON 来查找匹配项

    我正在访问 API 端点并得到如下所示的信息 emp id 123 firstNm test lastNm last dob 200 01 01 gender code F name Female description Female te
  • 在javascript中将cp1252转换为unicode

    我需要转换 cp125 2 在 javascript 函数中将文本转换为 unicode utf 转换 CP125 的功能1 到 utf 我已经找到了 如果有这个功能请帮帮我 谢谢 如果 ISO 8859 1 足够接近 由于简单的 byte
  • 如何使用替换距离比较两个字符串以查找 R 中匹配的字符数?

    在 R 中 我有两个字符向量 a 和 b a lt c abcdefg hijklmnop qrstuvwxyz b lt c abXdeXg hiXklXnoX Xrstuvwxyz 我想要一个函数来计算 a 的每个元素与 b 的相应元素
  • VB.net 中事件的显式添加/删除

    在 C 中 您可以显式定义add remove代码时event已订阅 取消订阅 这在 VB net 中可能吗 Imports System Runtime CompilerServices Private propchanged As Pr
  • .searchable 内的 NavigationLink 不起作用

    我了解它的新功能 但这似乎是非常基本的功能 但不在这里 当实施一个 searchable在新的 iOS 15 中 NavigationLink 似乎根本不起作用 理想情况下 可搜索将生成一个带有 ForEach 的过滤列表 对于每个项目 导
  • POS UI 设计和开发:应该包含哪些内容和避免哪些内容? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我必须为销售点 POS 系统设计和开发 UI 需要包含一些明显的功能 例如产品选择和数量 支付方式 投标金额 用户登录 因为许多用户将使用一台终
  • 如何在 PHP 中取消设置 cookie?

    我需要弄清楚如何取消设置此 cookie 到目前为止我尝试的一切都失败了 这就是我目前取消设置的方法 但它似乎不起作用 setcookie user id user id time 7200 我是这样设置的 setcookie user i
  • 您建议使用哪个 Perl 模块来发送和接收电子邮件?

    我正在搜索 Perl 模块来写入 SMTP 和读取 IMAP 电子邮件 您会建议使用哪个模块 对于电子邮件发送 电子邮件 发件人 http search cpan org perldoc Email Sender Manual QuickS
  • Jquery:从触发器返回值

    我正在使用触发器调用从自定义事件中获取值 但我希望它返回一个值 并且当我执行以下调用时它只给我 Object 对象 var user id my div trigger get id username 我的触发事件函数如下所示 my div
  • SQL Server 算术溢出错误将表达式转换为数据类型日期时间

    我想自定义我的订单 如果数量为负数 那么该行必须在拳头上 然后如果数量为正数 我将按 ExpDate 对其进行排序 SELECT WhsCode ItemCode LotNumber ExpDate Qty FROM rq Test2 OR
  • 监听 flutter(桌面)应用程序外部的按键

    我已设法打印用户在使用该应用程序时按下的键 但是 当用户不使用应用程序或在后台时 如何在 flutter 桌面上打印按键 听按键按下 Flutter 不提供用于在操作系统级别拦截关键事件的 API 为此 您需要为要运行的每个平台编写本机代码
  • 如何将 VLC 实例插入 QFrame

    我试图通过在 PyQt 小部件 QFrame 中嵌入 VLC 实例来制作一个简单的视频播放器应用程序 我找到了一些可以让我继续的例子 但我的代码不太有效 当我启动它时 它会播放 test video mp4 但它会在自己的单独窗口中启动常规
  • 在 Azure Web 应用程序中对本地文件执行 GET 时出现“404 未找到”

    我在 Azure 中部署了一个简单的基于节点的 Web 应用程序 以下是我的代码结构 在我的 js 代码中 当我执行xhr get调用我的 json 文件 如下所示 它会抛出一个GET https
  • 在我的 C# 应用程序中,Thread.Start 在某些稀疏情况下不会返回

    我用 C 编写了一个 TCP 服务器应用程序 应用程序侦听入站连接 在主侦听器线程中使用 TcpListener AcceptTcpClient 方法 当收到连接时 TcpListener AcceptTcpClient 解除阻塞并返回 T