gpt4 book ai didi

c# - .NET - 检测到 ContextSwitchDeadlock

转载 作者:IT王子 更新时间:2023-10-29 04:53:07 29 4
gpt4 key购买 nike

我在 c#(.net 3.5 cp,vs2010)中有一个类,它执行通常需要很长时间的复杂计算。一分钟后抛出异常,检测到 ContextSwitchDeadlock。异常是本地化的,我的非英语语言所以我不能复制粘贴,但意思如下:¨CLR 模块无法从上下文 COM ... 转换到上下文 COM ... 60 秒。拥有目标上下文/单元的子进程可能正在执行非抽取等待或处理非常长时间运行的操作而不抽取 Windows 系统消息。

基本上,看起来我的应用程序正在计算并且很长时间没有响应窗口,visual studio 将其关闭并报告可能出现死锁。

我试图做一些研究并找到了两个解决方案:

  1. 禁用 visual studio 调试器中的某些选项以检测死锁。对我不起作用,因为它仅用于调试目的。

  2. 调用一些 DoEvents 方法,但它适用于 Windows 窗体而不是 WPF,而我使用的是 WPF。

也有人建议创建单独的线程,但我是线程的新手,不知道该怎么做。有什么建议吗?

最佳答案

这只是来自托管调试助手 (MDA) 的警告。您的代码违反了对单线程单元 (STA) 线程的严格要求,不允许它们长时间阻塞。这个警告够真实,阻塞UI线程很容易造成死锁。但是你的解释很简单,它只是因为忙于计算而变得紧张,而不是因为它实际上被阻塞了。 MDA 无法区分。

您可以使用 Debug + Exceptions 关闭警告,打开 Managed Debugging Assistants 节点并取消勾选 ContextSwitchDeadlock。

这仍然会在用户的桌面上留下一个对世界来说死气沉沉的窗口,这并不是很好的用户体验。而且它可能会产生副作用,导致其他程序在向顶层窗口发送消息时变得无响应。

你确实需要使用线程来真正解决这个问题。看看 BackgroundWorker,它在 MSDN 库和许多其他地方都有详细记录。

关于c# - .NET - 检测到 ContextSwitchDeadlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8106159/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com