gpt4 book ai didi

c# - 应用程序仅在触发断点时挂起,.NET、C#、Visual Studio

转载 作者:行者123 更新时间:2023-11-30 18:40:07 24 4
gpt4 key购买 nike

不久前我重构了我的应用程序,从那时起我在使用 Visual Studio 2010 进行调试时遇到了问题。

我的应用程序在调试时按预期工作(不单步执行应用程序。附加的调试器不会导致任何问题)。但是,当触发断点并且我开始单步执行应用程序时,Visual Studio 和应用程序都在最多 3-4 步后挂起。
进一步强调这一点:它适用于我的客户,无论我是从 Visual Studio 启动它还是独立启动它 - 只要不触发断点。
我在代码中放置断点的位置并不重要。

集成环境: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() 的调用。

  • 是不是上面的方法有问题?

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

最佳答案

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

有关引用,请参阅 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx .

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

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

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

关于c# - 应用程序仅在触发断点时挂起,.NET、C#、Visual Studio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8739546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com