2012-01-05 43 views
3

我前一阵子重构我的应用程序,从那时起我一直在使用Visual Studio 2010中应用只挂断点被触发时,.NET,C#,Visual Studio中

我的应用程序按预期工作具有调试问题而不是而不是调试(不通过应用程序,附加的调试器不会导致任何问题)。但是,当触发断点时,我开始浏览应用程序,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()

  • 上述方法有问题吗?

此外,我会很感激任何提示你如何追踪这个错误。我目前的做法是将输出添加到控制台并选择性地停用部分代码。

+1

嗨! :)几乎可以肯定,这个问题是多线程相关的......你有任何类型的线程等待/锁定的东西,可能会导致循环死锁? – 2012-01-05 08:31:34

+0

@DarylTeo在部分代码中没有锁定。唯一的锁定语句在启动后立即执行 – yas4891 2012-01-05 08:39:17

+0

多线程,编辑并继续。 ThreadPools它的奇迹它的作用(大部分时间)。有时候,解决方案和代码的复杂性只会影响视觉工作室。我注意到一些第三方组件简单地打破了这种类型的代码,它甚至可能是一些重新编写的代码打破调试器等。 – CodingBarfield 2012-01-05 10:25:49

回答

0

我怀疑在某些情况下,由于InvokeRequired在于IsHandleCreatedfalse - 即使您不在GUI线程上,它也会返回false,因此您显示的代码会造成问题。

仅供参考,请参阅http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx

下面的代码会抛出一个异常,而不是挂起......当没有中断点时,它“按预期工作”这一事实可能是调试器冻结所有线程而达到断点的结果,这反过来可能导致一个不同的执行顺序等。

总而言之,您的代码中可能会有一些“竞争条件”,其中BeginInvokeIfRequired在该控件具有Handle之前在新创建的控件上调用。这甚至可以是您使用的一些第三方代码...

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"); 
     } 
} 
+0

非常感谢您的答案。这只适用于如果我初始化后创建了一个'Control' - 对吗?不幸的是,我不会在运行时创建任何控件(在'InitializeComponents()'之后)。我只是改变了'Visible'属性 – yas4891 2012-01-05 08:57:56

+0

@ yas4891不是真的,甚至创建的控件可能处于'Handle'尚未创建的状态......和一些第三方库(过去例如Infragen ...)创建用于内部使用(如测量的东西)的不可见控制... – Yahia 2012-01-05 09:01:41

+0

我已经添加控制台输出到BeginInvokeIfRequired,以防手柄未被创建。我只在启动期间得到输出。我不使用第三方库(除非你认为MSChart是第三方库) – yas4891 2012-01-05 13:37:12

相关问题