Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当触发断点时,应用程序才会挂起.NET、C#、Visual Studio_C#_.net_Visual Studio_Debugging - Fatal编程技术网

仅当触发断点时,应用程序才会挂起.NET、C#、Visual Studio

仅当触发断点时,应用程序才会挂起.NET、C#、Visual Studio,c#,.net,visual-studio,debugging,C#,.net,Visual Studio,Debugging,我不久前重构了我的应用程序,从那以后,我一直在使用VisualStudio2010进行调试 我的应用程序在未调试时按预期工作(未单步执行应用程序。附加的调试器不会导致任何问题)。但是,当触发断点并且我开始单步执行应用程序时,Visual Studio和应用程序最多会在3-4个步骤后挂起。 更强调这一点:无论我是从Visual Studio还是单机版开始,只要没有触发断点,它都能很好地与我的客户配合使用。 在代码中我把断点放在哪里并不重要 IDE:Visual Studio 2010 x64 平台

我不久前重构了我的应用程序,从那以后,我一直在使用VisualStudio2010进行调试

我的应用程序在未调试时按预期工作(未单步执行应用程序。附加的调试器不会导致任何问题)。但是,当触发断点并且我开始单步执行应用程序时,Visual Studio和应用程序最多会在3-4个步骤后挂起。
更强调这一点:无论我是从Visual Studio还是单机版开始,只要没有触发断点,它都能很好地与我的客户配合使用。
在代码中我把断点放在哪里并不重要

IDE:Visual Studio 2010 x64
平台:.NET 4.0

重构包括对
BeginInvoke
的大量跨线程调用-所有调用都通过以下方法进行:

public static void BeginInvokeIfRequired(this Control control, Action action)
{
    if (control.InvokeRequired)
    {
        control.BeginInvoke(action);
    }
    else
    {
        action.Invoke();
    }
}
项目中没有对
Control.Invoke()
的单个调用

  • 上述方法有什么问题吗

此外,如果您能提供任何关于如何追踪此bug的提示,我将不胜感激。我目前的方法是将输出添加到控制台,并有选择地停用部分代码。

我怀疑在某些情况下,您显示的代码会造成问题,因为
invokererequired
位于
IsHandleCreated
is
false
-即使您不在GUI线程上,它也会返回false

有关参考,请参阅

以下代码引发异常而不是挂起。。。当未命中断点时,它“按预期工作”,这可能是因为调试器在命中断点时冻结了所有线程,这反过来可能导致不同的执行顺序等

总之,这意味着:您的代码中可能有一些“竞争条件”,在新创建的控件具有
句柄之前,对该控件调用
BeginInvokeIfRequired
。这甚至可以是您使用的某些第三方代码

public static void BeginInvokeIfRequired(this Control control, Action action)
{
    if (control.IsHandleCreated)
    {
        if (control.InvokeRequired)
        {
            control.BeginInvoke(action);
        }
        else
        {
            action.Invoke();
        }
    }
    else { 
         // in this case InvokeRequired might lie ! 
         throw new Exception ( "InvokeRequired is possibly wrong in this case" );
         }
}

嘿,亚斯!:)几乎可以肯定,此问题与多线程相关。。。您是否有任何类型的线程等待/锁定内容可能会导致循环死锁?@DarylTeo在代码部分没有锁定。唯一的lock语句在启动多线程、编辑并继续后立即执行。ThreadPools这是一个奇迹,它可以工作(大多数时候)。有时,解决方案和代码的复杂性会使VisualStudio崩溃。我注意到一些第三方组件只是破坏了这种代码,甚至可能是一些重新进入的代码破坏了调试器等等。非常感谢您的回答。只有在初始化后我创建了一个
控件
,这才适用-对吗?不幸的是,我没有在运行时创建任何控件(在
InitializeComponents()
之后)。我只需更改可见的
property@yas4891不太可能,即使创建的控件也可能处于尚未创建
Handle
的状态。。。一些第三方库(在过去,例如Infragen…)为内部使用创建不可见的控件(如测量工具)…我已将控制台输出添加到BeginInvokeIfRequired,以防未创建句柄。我只在启动期间获得输出。我不使用第三方库(除非你认为MSCADE是第三方LIB)@ YAS48 91是的,在这方面,我认为MSCar是一个“第三方LIB”,因为它是执行的代码,你没有写/不能访问它。