【问题标题】:C# app hangs not able to enter a methodC# 应用程序挂起无法输入方法
【发布时间】:2015-04-28 07:25:22
【问题描述】:

我遇到了我生命中最奇怪的错误之一。一旦我尝试调用无害的方法,我的应用程序就会挂起。最糟糕的是,Visual Studio 的调试器无法显示任何有用的东西,我所看到的只是该应用程序正在尝试调用一个方法,但甚至无法进入它!当我按下“暂停”按钮时,它只会显示:

从那以后,该应用程序一直没有响应! F10、F11、F5 什么都不起作用 - 它无法输入方法。

【问题讨论】:

  • 你确定它实际上是方法调用本身吗? VS 有时会显示下一个命令,而不是“真正”挂起的命令。也许其中一个条件是阻塞或破坏东西?您是使用从MarshalByRefObject 派生的东西还是指定Synchronized 属性?
  • 我有一个线程在后台运行,当我关闭它并再次运行代码时,暂停按钮将代码停止在不同的位置 - 检查答案。
  • 好吧,请记住,将来您可以更改正在查看的线程 - 在线程窗口或并行堆栈中。在调试多线程应用程序时非常有用:)
  • 哇,谢谢伙计 :) 确实谢谢 - 从来不知道 :)

标签: c# constructor static parallel-processing


【解决方案1】:

我找到了解决方案:我在 GaussianAITable 类的静态构造函数中使用了Parallel.For,如下所示:

    Parallel.For(0, ColumnCount, i =>
        {
            for (int j = 0; j < RowCount; ++j)
            {
                WorldPosition[i, j].X = (i - HalfColumnCount) * ColumnSize + ColumnSize / 2;
                WorldPosition[i, j].Y = (j - HalfRowCount) * RowSize + RowSize / 2;
            }
        });

当我删除所有并行代码然后尝试再次启动相同的方法时,我发现了问题。该应用程序挂起,但是当我按下“暂停”按钮时,它最终出现在静态构造函数中 - 仍在尝试完成工作。我必须指出,这项工作本身是无害的,并且使用简单的for 循环而不是Parallel.For,它可以很快完成。 C# 的静态构造函数很糟糕,它们几乎无法调试,我很幸运找到了这个。希望这对其他人有帮助。

【讨论】:

  • 好吧,没有人强迫您使用静态构造函数 :) 它们确实不是为运行 并行 CPU 密集型任务而设计的。
  • 它们有时很有用 :) 虽然不是 mah 代码 :) 在同事之后清理 :)。我也不喜欢静态构造函数。
  • 对于这样的情况,至少,我会让代码以Lazy 之类的方式运行。但是,是的,理想情况下,您希望以可预测的方式初始化这些东西,而不是依赖静态构造函数。甚至可能一开始就没有使用静态字段(虽然我可以理解试图避免游戏代码中的间接性,但现在它仍然应该基于分析器的结果,而不仅仅是 30 年的实践:)))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 2018-04-28
  • 2013-06-19
  • 1970-01-01
相关资源
最近更新 更多