在socket编程中出现ContextSwitchDeadlock的问题

wickey_lu wickey_lu 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我要实现一个简单的服务器,其中主要的一段代码如下:
public void ServerThreadProc()
{
try
{
clientSocket = serverSocket.Accept();

//接收客户端发来的数据
byte[] recvBytes = new byte[1024];
int bytes = 0;
bytes = clientSocket.Receive(recvBytes, 0, clientSocket.Available, SocketFlags.None);
string strRequest = System.Text.Encoding.Unicode.GetString(recvBytes, 0, bytes);

ProcessParams(strRequest); //从strRequest中提取必要的参数

c.ConvertF(a,b); //a,b是类的成员变量,已在ProcessParams(strRequest)中提取了正确的值,c 是一个类的对象,其类型为另一dll中的某个类,这里通过c来访问该类中的Convert函数,Convert中调用了word的一些编程api

clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
catch (Exception ex)
{
if (clientSocket.Connected)
{
clientSocket.Close();
}
}
现在遇到以下问题,上述的代码一直到执行完ProcessParams(strRequest)结果还是正确的.但执行到Convert函数中(注意Convert位于另一dll中)的调用Word编程api那一句时就出错了.出现了以下提示:
检测到 ContextSwitchDeadlock
Message: CLR 无法从 COM 上下文 0x196c58 转换为 COM 上下文 0x196ae8,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积。要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。

请不要告诉我要把调试->异常->Managed Debugging Assistant->ContextSwitchDeadlock的引发选项去掉,我试过了不是这个问题.也不要说把线程的ApartmentState设为ApartmentState.MTA,也不是这个原因导致的.
并且不要告诉我把c.ConvertF(a,b)的调用放在一个线程中,我也试过了,这样虽然可以,但由于此时会执行了clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();,搞到我不能向客户端发送执行的结果了.
我发现只有在clientSocket被close后,再执行ConvertF这个方法才会没有出错,但我必须在完成前不能关闭那个clientSocket,因为我还要把处理的结果发送会给客户端.请各位高手帮我解决一下这个问题.
...全文

相关推荐

自动化测试框架实战指南:从Pytest到Selenium的10大框架选型与应用

自动化测试框架是软件质量保障体系中的核心组件,它通过提供脚本组织、数据驱动、前置后置条件管理等工程化解决方案,将测试活动从手工操作提升为可重复、可维护的自动化流程。其核心原理在于分离测试逻辑与测试数据,通过模块化设计实现用例的高效管理与执行。在技术价值层面,一套优秀的框架能显著提升测试效率、降低维护成本,并确保测试结果的可靠性。当前,随着微服务与前后端分离架构的普及,接口自动化测试成为基石,而Web UI自动化、移动端测试及性能测试也各有其专业框架支撑。在实际应用场景中,针对Python技术栈,Pytest

weixin_30340819

Python Selenium全栈实战:从自动化测试到企业级RPA应用

Web自动化是现代软件工程中的关键技术,它通过模拟用户操作实现浏览器行为的程序化控制。其核心原理是借助WebDriver协议,让代码能够驱动真实浏览器执行点击、输入、导航等交互。这项技术的价值在于将人力从重复、耗时的Web操作中解放出来,大幅提升测试效率和业务流程执行的一致性。在应用场景上,它不仅是UI自动化测试和跨浏览器兼容性验证的标配,更可扩展至数据抓取、报表自动生成等业务流程自动化(RPA)领域。本文聚焦于Python Selenium这一经典组合,深入剖析如何构建健壮、可维护的**企业级自动化解决方

weixin_30751947

Python Selenium自动化测试报告生成实战:从pytest-html到Allure

在软件测试领域,自动化测试报告是评估测试执行结果、进行质量分析的核心产出物。其原理在于通过测试框架收集执行过程中的状态、日志与截图等数据,并利用报告引擎将其结构化、可视化。一份优秀的测试报告不仅能提升测试结果的可读性与可信度,更能为团队协作与持续改进提供数据支撑,其技术价值在于将原始的、离散的测试数据转化为可交互、可分析的决策依据。在应用场景上,无论是敏捷开发中的快速反馈,还是CI/CD流水线中的质量门禁,清晰直观的测试报告都至关重要。本文聚焦于Python与Selenium技术栈,深入探讨如何利用pyte

weixin_30527323

pytest测试实战pdf_Python 自动化测试(五): Pytest 结合 Allure 生成测试报告

本文节选自霍格沃玆测试学院测试开发内部教材,进阶学习文末加群!测试报告在项目中是至关重要的角色,一个好的测试报告:可以体现测试人员的工作量;开发人员可以从测试报告中了解缺陷的情况;测试经理可以从测试报告中看到测试人员的执行情况及测试用例的覆盖率;项目负责人可以通过测试报告查看整个项目还余留多少问题,此次版本是否测试通过;所以打造一个美观、一目了然的测试报告,清晰的反应质量问题,并提供给相...

weixin_39627390

Web自动化测试框架与工具选型指南:从Selenium到Cypress的实战解析

Web自动化测试是软件工程中提升测试效率与可靠性的关键技术,其核心原理是通过程序模拟用户在浏览器中的操作行为,实现测试用例的自动执行与验证。从技术价值看,它不仅能替代大量重复性手工测试,还能集成到CI/CD流程中实现持续验证,是现代敏捷开发和DevOps实践中不可或缺的一环。在应用场景上,无论是电商网站的功能回归测试、SaaS平台的跨浏览器兼容性验证,还是企业后台系统的业务流程自动化,都离不开稳健的自动化测试体系。本文聚焦于当前主流的Web自动化测试工具链,深度解析Selenium WebDriver作为行

weixin_33726313
评论 5
收藏 已收藏
分享
返回顶部
wickey_lu
C# 111,128 成员 642,536 内容