我经历了不同的问题,并没有真正找到适合我的问题的任何东西,但我也不完全知道要查找什么以获得任何结果,所以我可能错过了一些条目。如果有人可以链接到可能有帮助的东西,我将不胜感激。
我将首先发布一个我正在使用的代码示例(不是确切的代码,因为我无法发布它),我认为它会导致应用程序崩溃。
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 是一个私有(private)代码库,其中包含从项目移植到项目的各种通用工具。
我不确定发生了什么。我知道这段代码有效,因为它适用于我使用过的所有其他代码行。
唯一不同的是PC本身。
它的设置方式是在 datagridview 中,单击单元格时会弹出一个表单,供您放置该特定行的注释并保存它们。
一旦表单弹出,我关闭它,应用程序立即崩溃并且无法恢复,但也没有报告异常。
这只发生在不通过 Visual Studio 运行时(不管它是发布还是调试版本,只要它是否在 Visual Studio 中运行)。
我确定我可能错过了一些细节,如果您需要我提供任何其他信息,请告诉我,但这总结了我的问题。
编辑:
通过进一步的调试,我在所有可能的地方添加了多个日志语句,这些语句可能与表单关闭、打开、执行预期目的有关。
我发现的是
FormClosing
事件使它一直通过。ShowDialog(this)
预计返回 DialogResult
枚举值,但在它实际尝试返回此值时挂起,导致应用程序卡住。我还发现,将最终调用表单的线程的线程优先级设置为 AboveNormal 可以解决这个问题。但是,我认为这不是一个足够好的解决方案。
最佳答案
看来我有一个疏忽,尽管我仍然不确定这是否是解决我的问题的正确方法。
我对整个 ApartmentState 是 MTA 还是 STA 了解不多,或者如何确定何时应该使用哪个。
解决我的问题的方法是遍历从我的主线程中分离出来的所有线程并将它们的 ApartmentState 设置为 STA,我认为这已经从以前的代码行完成以解决我遇到的另一个问题(这就是协作问题)。
但是,是的,我浏览了整个解决方案,发现正在创建新线程的所有实例并将它们的 ApartmentState 显式设置为 STA 已经解决了崩溃问题。
如果有人可以提供一些好的 Material 来定义差异以及何时使用其中一个,或者如何确定何时应该使用一个而不是另一个,将不胜感激。
关于C# 应用程序在关闭自定义表单时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35581964/