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

C#关闭自定义表单时应用程序崩溃,c#,xml,winforms,datagridview,crash,C#,Xml,Winforms,Datagridview,Crash,我已经通过了不同的问题,并没有真正找到任何适合我的问题,但我也不知道要查找什么来获得任何结果,所以我可能错过了一些条目。如果有人能链接到一些可能有帮助的东西,我将不胜感激 首先,我将发布一个我正在使用的代码示例(不是确切的代码,因为我无法发布此代码),我认为这是导致应用程序崩溃的原因 using (var editForm = new frmEditableText("Alarm Note", "Title")) { var result = editForm.ShowDialog(th

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

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

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是一个私有代码库,其中包含各种通用工具,这些工具可以从一个项目移植到另一个项目

我不太清楚到底发生了什么事。我知道这段代码在我使用过的所有其他代码行上都能工作

唯一不同的是个人电脑本身

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

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

只有在未通过visual studio运行时才会发生这种情况(无论它是发布版本还是调试版本,仅当它正在或未在visual studio中运行时才重要)

我相信我可能错过了一些细节,请让我知道,如果有任何其他信息,你需要从我,但这关于总结我的问题

编辑:

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

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

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


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

您是否尝试订阅AppDomain.UnhandledException事件?您可以将其用作最终的“一网打尽”(无双关语),并将其记录到一个异常文件中,请参见

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


祝你好运

我这边似乎有疏忽,尽管我仍然不确定这是否是解决我问题的正确方法

我不太了解MTA或STA的整个公寓状态,也不知道如何确定何时应该使用哪个

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

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


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

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