问题标签 [contextswitchdeadlock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
5581 浏览

c# - 上下文切换死锁

在 VS 2008 中调试我的程序时,我遇到了以下错误:

CLR 在 60 秒内无法从 COM 上下文 0x34fc1a0 转换到 COM 上下文 0x34fc258。拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。为了避免这种情况

即使代码仅包含一个简单的 C# 计时器,它似乎也出现了死锁:请参见下面的代码段:

据我所知,计时器应该运行,经过然后再次初始化,我看不到死锁的本地原因。

我知道如何关闭此错误消息,但觉得这不是解决方案,而是掩盖了问题。

0 投票
1 回答
1839 浏览

c# - 读取 xml 文件时 C# 中的 Contextswitchdeadlock 错误

我有一个奇怪的错误:

托管调试助手“ContextSwitchDeadlock”在“C:\Documents and Settings\Lena G\My Documents\SchoolStuff\IR Information\Home Work\FianlProject\finalProject\finalProject\bin\Debug\finalProject.vshost.exe”中检测到问题。附加信息:CLR 在 60 秒内无法从 COM 上下文 0x3407968 转换到 COM 上下文 0x3407ad8。拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。为了避免这个问题,

在这个错误中,我可以继续运行或中断,如果我继续,那么它运行正常,但仍然让我担心。我有一个程序,我读取一个包含一些文本的 xml 文件,将单词放在哈希表中,然后从哈希写入规则文本文件。

Appriciate 如果有人可以帮助我解决这个问题。

提前致谢,

莉娜

0 投票
2 回答
1852 浏览

c# - 协作/非抢占式线程避免死锁?

有什么创意可以避免在不执行 O/S Thread.Sleep(10) 的情况下通过协作/非抢占式多任务处理在产量或睡眠上出现死锁?通常,yield 或 sleep 调用将回调调度程序以运行其他任务。但这有时会产生死锁。

一些背景:

这个应用程序对速度有巨大的需求,到目前为止,与同行业的其他系统相比,它的速度非常快。其中一种速度技术是协作/非抢占式线程,而不是从 O/S 线程进行上下文切换的成本。

高层设计了一个优先级管理器,它根据优先级和处理时间调用任务。每个任务执行一次“迭代”工作并返回以在优先级队列中再次等待。

非抢占式线程的棘手之处在于,当您希望特定任务在工作过程中停止并等待来自不同任务的其他事件后再继续时该怎么做。

在这种情况下,我们有 3 个任务,AB 和 C,其中 A 是一个控制器,必须同步 B 和 C 的活动。首先,A 启动 B 和 C。然后 B 产生,因此 C 被调用。当 C 让步时,A 看到它们都处于非活动状态,决定是 B 运行的时间,但还不是 C 的时间。Well B 现在卡在一个调用 C 的 yield 中,所以它永远无法运行。

0 投票
1 回答
560 浏览

wpf - 带有 log4net 和 NHibernate 的 Visual Studio 2008 ContextSwitchDeadlock

我在这里遇到了一个非常奇怪的错误,我不确定我是否正在遵循正确的路径来解决它,甚至如何解决它。

这是我面临的问题:我开始调试使用 log4net、NHibernate 和 LINQ to NHibernate 的 WPF 应用程序,当我尝试从数据库中获取实体时,我的应用程序和有时 VS 会挂起很长时间,之后稍后会打开一个异常对话框,其中显示一条消息,其中包含有关 ContextSwitchDeadlock MDA 的以下信息:

CLR 在 60 秒内无法从 COM 上下文 0x34fc1a0 转换到 COM 上下文 0x34fc258。拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。为了避免这种情况

我将代码文件复制到一个新项目并删除了旧项目以查看是否可以使此消息消失,认为它与我的配置有关。我开始一次添加一些东西,看看是什么原因造成的,当我包含 log4net 配置代码时,错误再次出现。首先,我通过 AssemblyInfo 包含它,后来在应用程序启动时通过代码配置包含它,并且完全没有任何改变:(

所以,这是我的发现:

  • 只有当我使用 log4net 时才会发生这种情况。
  • 它发生在 NHibernate 从数据库加载实体(延迟加载)时。

我不知道这个错误的来源可能是什么。它仅在 Visual Studio 中调试时发生。我已经尝试按照以下页面的“启用和禁用 MDA”部分的步骤进行操作:http: //msdn.microsoft.com/en-us/library/d21c150d.aspx,但这也不起作用,VS仍然挂起并且它的内存使用量增加了。

当我正常运行程序时,这一切都不会发生,所以我很确定这不是死锁情况,正如这个问题所暗示的那样:contextswitchdeadlock(我也尝试过那里发布的解决方案)。

因此,我决定在部署我的应用程序时禁用 log4net 并再次启用它。

我发布这个问题是为了了解其他人是否遇到过这个错误,或者是否有人对如何解决它有一些建议。最后,它可能会帮助其他面临同样问题的人。

0 投票
1 回答
784 浏览

c# - c# winforms 在调试器中......检测到上下文切换死锁

所以我正在运行一个单元测试,这是一个“糟糕”的单元测试,需要很长时间才能运行。(以前工作得很好)

现在我收到 Context switch deadlock Detected 错误,我猜是因为完成整个测试的过程非常漫长(20 分钟)。

很像这里描述的:http: //bytes.com/topic/c-sharp/answers/471705-context-switch-deadlock-detected

我可以做些什么来让单元测试运行而不会出现错误?

如果没有别的东西,我可以把它从测试中拿出来写一个小包装应用程序,但我们每年只做一两次这些测试,这似乎是很多工作......

谢谢,

卡尔-

0 投票
2 回答
2939 浏览

c# - 为什么发送电子邮件程序冻结?

我做了一个小程序,基本上可以通过 yahoo smtp 服务器发送电子邮件。我的代码:

奇怪的是,它在第​​一周就奏效了。我可以毫无问题地发送消息。然后就在昨天,程序刚刚开始冻结并且没有响应(我没有更改代码)。为什么会这样?如何修改我的程序?

编辑:@Andreas Niedermair 现在我刚刚尝试了该程序并将其放置了一分钟,然后显示错误:检测到 ContextSwitchDeadlock 消息:CLR 无法从 COM 上下文 0x21eb78 转换到 COM 上下文 0x21ece8 60 秒。拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。为避免此问题,所有单线程单元 (STA) 线程都应使用泵送等待原语(例如 CoWaitForMultipleHandles)并在长时间运行的操作期间定期泵送消息。

谢谢你的帮助!

0 投票
1 回答
2314 浏览

wpf - WPF:集成到 WinForms 错误 - “CLR 在 60 秒内无法从 COM 上下文 0x1a8188 转换到 COM 上下文 0x1a8018”

我得到的完整错误如下:

CLR 在 60 秒内无法从 COM 上下文 0x1a8188 转换到 COM 上下文 0x1a8018。拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。为避免此问题,所有单线程单元 (STA) 线程都应使用泵送等待原语(例如 CoWaitForMultipleHandles)并在长时间运行的操作期间定期泵送消息。

知道这意味着什么吗?又该如何解决?我尝试在谷歌上搜索,但找不到任何重要的结果,即与我的具体情况有关。

编辑:具体场景: 1. 将 WPF 集成到 WinForms 2. WPF 屏幕是为插件 dll 编写的,该插件动态加载到主应用程序中。

谢谢

哈萨宁

0 投票
1 回答
165 浏览

c# - 在运行时检测 ContextDeadlockSwitch

AC# 代码从 C++ dll 中检索属性值,此检索会阻塞当前线程,直到 dll 返回该值。在调试模式下,当检索需要很长时间时,MDA 会抛出一个 ContextDeadlockSwitch。

我想不可能在运行时捕获 ContextDeadlockSwitch,但是有没有办法让类似于 MDA 的机制可以抛出 C# 可以捕获的类似异常来检测这个死锁?

原因是让 C# 代码提示用户要么继续等待几秒钟,要么强行杀死并重新启动应用程序。

0 投票
1 回答
31957 浏览

c# - .NET - 检测到 ContextSwitchDeadlock

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

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

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

  1. 禁用 Visual Studio 调试器中的某些选项以检测死锁。不要为我工作,因为它仅用于调试目的。

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

还有人建议创建单独的线程,但我对线程完全陌生,不知道我该怎么做。请问有什么建议吗?

0 投票
1 回答
6646 浏览

c# - 0x80010100:系统调用失败”异常,ContextSwitchDeadlock

长话短说:在使用 COM inproc-server (dll) 的 C# 应用程序中,我遇到“0x80010100:系统调用失败”异常,并且在调试模式下还有 ContextSwitchDeadlock 异常。

现在更详细:

1)C#app初始化STA,创建COM对象(注册为“Apartment”);然后 in 订阅它的连接点,并开始使用该对象。

2) 在某个阶段,COM 对象会生成很多事件,将一个非常大的 COM 对象集合作为参数传递,这些对象是在同一个单元中创建的。

3)C#端的event-handler处理上述集合,偶尔调用对象的一些方法。在某个阶段,后面的调用开始失败,并出现上述异常。

在 COM 端,公寓使用了一个隐藏窗口,其 winproc 如下所示:

事件从 COM 服务器的其他部分发布到此窗口:

这些事件是与实际参数绑定的标准 ATL CP 实现,它们归结为如下内容:

在 C# 中,处理程序如下所示:

===================

那么,上述问题是否会仅仅因为公寓的消息队列中过多地加载了它试图传递的事件而发生呢?或者应该完全阻止消息循环以导致这种行为?

让我们假设消息队列有 2 个连续事件,这些事件评估为“onEvent”调用。第一个输入 C# 托管代码,它尝试重新输入非托管代码,同一个单元。通常,这是允许的,我们经常这样做。什么时候,什么情况下会失败?

谢谢。