当前位置:  开发笔记 > 编程语言 > 正文

contextswitchdeadlock

如何解决《contextswitchdeadlock》经验,为你挑选了1个好方法。

在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();

    }



    /// 
    /// Initialise a timer with a timer interval configured from app.config. Enable the timer and 
    /// register an appropriate event handler
    /// 
    private void InitialiseTimer()
    {


        if (m_Timer == null)
        {
            // look up the default backoff time from the config
            string backOffInt = ConfigurationSettings.AppSettings["BackOffInterval"];

            int backoffInterval = 1000;


            m_Timer = new System.Timers.Timer();


            // set the timer interval to 5 seconds
            m_Timer.Interval = backoffInterval;

            m_Timer.Elapsed += new ElapsedEventHandler(m_Timer_Elapsed);
        }

        m_Timer.Enabled = true;
    }


    private void StopTimer()
    {

        if (m_Timer != null)
        {
            m_Timer.Enabled = false;
        }
    }

    void m_Timer_Elapsed(object p_Sender, ElapsedEventArgs p_E)
    {

        RequestWork();
    }

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

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



1> Hath..:

如果你认为你肯定没有陷入僵局,你可以关闭它:

Visual Studio中的Debug-> Exceptions-> Managed Debug Assistants菜单,取消选中ContextSwitchDeadlock

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有