我在c#(.net 3.5 cp,vs2010)中有一个类,它执行复杂的计算,这通常需要很长时间.一分钟后,抛出异常,检测到ContextSwitchDeadlock.异常是本地化的,对于我的非英语语言,所以我不能复制粘贴,但意思如下:¨CLR模块无法从上下文COM ...转换到上下文COM ... 60秒.拥有目标上下文/公寓的子进程可能正在进行非抽空等待或处理非常长时间运行的操作而不会抽取Windows系统消息.
基本上,看起来我的应用程序是计算并且长时间没有响应窗口,Visual Studio关闭它并报告可疑的死锁.
我试图做一些研究,找到两个解决方案:
在visual studio debbuger中禁用某些选项以检测死锁.Dost不适合我,因为它仅用于调试目的.
调用一些DoEvents方法,但它适用于Windows窗体而不是WPF,我使用的是WPF.
还有建议创建单独的线程,但我是完全新的线程,不知道我该怎么办.有什么建议吗?
在VS 2008中调试我的程序时,我遇到了以下错误:
CLR无法从COM上下文0x34fc1a0过渡到COM上下文0x34fc258 60秒.拥有目标上下文/公寓的线程很可能是在非抽空等待或处理非常长时间运行的操作而不抽取Windows消息.这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随时间不断累积.为了避免这种情况
它似乎是死锁,即使代码只包含一个简单的C#计时器:请参阅下面的代码段:
private void RequestWork()
{
// The timer will be re-intialised if there are still no wating jobs in the database
StopTimer();
// assign all the threads some work
InitialiseTimer();
}
/// <summary>
/// Initialise a timer with a timer interval configured from app.config. Enable the timer and
/// register an appropriate event handler
/// </summary>
private void InitialiseTimer()
{
if (m_Timer == null)
{
// look up the default backoff time from the config
string …Run Code Online (Sandbox Code Playgroud)