【问题标题】:C# Application crashing upon closing custom formC# 应用程序在关闭自定义表单时崩溃
【发布时间】:2016-02-23 15:46:42
【问题描述】:

我经历了不同的问题,并没有真正找到适合我的问题的任何东西,但我也不完全知道要查找什么以获得任何结果,所以我可能错过了一些条目。如果有人可以链接到可能有帮助的东西,我将不胜感激。

我将首先发布一个我正在使用的代码示例(不是确切的代码,因为我无法发布它),我认为它会导致应用程序崩溃。

using (var editForm = new frmEditableText("Alarm Note", "Title"))
{
    var result = editForm.ShowDialog(this);
    if (result == DialogResult.OK)
    {
        string temp = editForm.ReturnValue;
        string xPath = String.Format("AlarmsDb/Alarm[Id = '{0}']/Notes", alarmID);
        if (!Tools.OverWriteXMLSingleNote(alarm_xml_path, xPath, temp))
            logErr("Error overwiting XML alarm: {0}", xPath);
        AlarmDb.SetNote(alarmID, temp);
    }
}

Tools 是一个私有代码库,其中包含从项目移植到项目的各种通用工具。

我不确定发生了什么。我知道这段代码可以在我使用过的所有其他代码行上运行。

唯一不同的是PC本身。

它的设置方式是在 datagridview 中,单击单元格时会弹出一个表单,供您放置特定行的注释并保存它们。

一旦表单弹出,我关闭它,应用程序立即崩溃并且无法恢复,但也没有报告异常。

只有在没有通过 Visual Studio 运行时才会发生这种情况(不管它是发布版还是调试版,只要它是否在 Visual Studio 中运行)。

我确定我可能遗漏了一些细节,如果您需要我提供任何其他信息,请告诉我,但这总结了我的问题。

编辑:

通过进一步的调试,我在所有可能的地方添加了多个日志语句,这些语句可能与表单关闭、打开、执行预期目的有关。

我发现FormClosing 事件一直在进行。

ShowDialog(this) 预计会返回一个DialogResult 枚举值,但在它实际尝试返回此值时挂起,导致应用程序冻结。

我还发现,将最终调用表单的线程的线程优先级设置为 AboveNormal 可以解决这个问题。但是我认为这不是一个足够好的解决方案。

【问题讨论】:

  • 由于您的专有代码看起来可能是罪魁祸首,恐怕如果不确切知道它的作用,这可能无法回答。
  • 它可能是在与用户操作没有直接关联的线程上抛出的异常(它可以从单击开始,然后按照自己的方式进行)。添加一些 try..catch 块来检测抛出异常的区域并尝试将其缩小到单行代码。
  • 所以我已经调试了一段时间了。我在多个地方添加了日志语句,我到处都有尝试捕获。我从日志语句中发现它永远不会从对editForm.ShowDialog(this) 的调用中返回。我有一个 FormClosing 事件,它在每执行第二行代码后都有日志语句,并且它们都被记录下来,直到 ShowDialog(this) 预计返回一个值。 tl;dr 它挂在var result = editFormShowDialog(this) 返回一个值,正如我从大量的日志语句中发现的那样。

标签: c# xml winforms datagridview crash


【解决方案1】:

看来我有疏忽,但我仍然不确定这是否是解决我的问题的正确方法。

我不太了解整个 ApartmentState 是 MTA 还是 STA,也不知道如何确定何时应该使用哪个。

解决我的问题的方法是遍历从我的主线程中分离出来的所有线程并将它们的 ApartmentState 设置为 STA,我认为这已经从以前的代码行完成以解决我遇到的另一个问题(例如协作问题)。

但是,是的,我浏览了整个解决方案,发现正在创建新线程的所有实例并将它们的 ApartmentState 显式设置为 STA 已经解决了崩溃问题。

如果有人可以提供一些好的材料来定义差异以及何时使用其中一个,或者如何确定何时应该使用一个而不是另一个,我们将不胜感激。

【讨论】:

    【解决方案2】:

    您是否尝试订阅 AppDomain.UnhandledException 事件?您可以将其用作最终的全部捕获(没有双关语)并将异常记录到文件中 https://msdn.microsoft.com/en-gb/library/system.appdomain.unhandledexception(v=vs.110).aspx

    另外/另外 - 您是否查看了事件查看器?

    祝你好运

    【讨论】:

    • 这似乎更像是在提问而不是提供答案。
    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多