C#应用程序在关闭自定义表单时崩溃

时间:2016-02-23 15:46:43

标签: c# xml winforms datagridview crash

我已经遇到了不同的问题并且没有找到任何适合我的问题的东西,但我也不知道该怎样查找以获得任何结果,所以我可能错过了一些条目。如果有人可以链接到可能有帮助的东西,我将非常感激。

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

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

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

我不确定发生了什么。我知道这段代码可以工作,因为它正在处理我用过的所有其他代码行。

唯一不同的是PC本身。

它的设置方式是在数据网格视图中,单击单击它会弹出一个表单,供您放置该特定行的注释并保存。

一旦表单弹出,我关闭它并立即崩溃并且不会恢复,但也没有报告异常。

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

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

编辑:

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

我发现FormClosing事件已经完成了所有事情。

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

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

2 个答案:

答案 0 :(得分:0)

我的结果似乎有疏忽,虽然我仍然不确定这是否是解决问题的正确方法。

我不太了解整个ApartmentState是MTA或STA,或者如何识别应该使用哪个。

解决了我的问题虽然是通过我的主线程分离出来的所有线程并将他们的ApartmentState设置为STA,我认为这已经从之前的代码行完成,以解决我遇到的另一个问题(例如合作的问题)。

但是,是的,我完成了整个解决方案,发现所有新线程的实例都已创建并明确将其ApartmentState设置为STA已解决了崩溃问题。

如果有人能提供一些定义差异的好材料,何时使用,或者如何确定何时应该使用另一个,那么我们将非常感激。

答案 1 :(得分:-1)

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

另外/另外 - 你是否看过事件查看器?

祝你好运