C# 应用程序在关闭自定义表单时崩溃
C# Application crashing upon closing custom form
我已经经历了不同的问题,并没有真正找到适合我的问题的任何东西,但我也不知道要查找什么才能得到任何结果,所以我可能遗漏了一些条目。如果有人可以 link 提供一些可能有帮助的东西,我将不胜感激。
我将首先发布我正在使用的代码示例(不是确切的代码,因为我无法发布它),我认为它会导致应用程序崩溃。
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 本身。
它的设置方式是在数据网格视图中,单击单元格会弹出一个表单,供您为该特定行添加注释并保存。
弹出表单后,我将其关闭,应用程序立即崩溃且无法恢复,但也没有报告异常。
只有在 运行 到 visual studio 之间才会发生这种情况(无论是发布版本还是调试版本,只有在 [=46= 中是或不是 运行 时才会发生这种情况]).
我确定我可能遗漏了一些细节,如果您需要我提供任何其他信息,请告诉我,但这总结了我的问题。
编辑:
通过一些进一步的调试,我在所有可能与表单关闭、打开和执行预期目的有关的地方添加了多个日志语句。
我发现 FormClosing
事件一直持续到现在。
ShowDialog(this)
预期 return 一个 DialogResult
枚举值,但在它实际尝试 return 这个值时挂起,导致应用程序冻结。
我还发现,将最终调用表单的线程的线程优先级设置为 AboveNormal 可以解决这个问题。但是我认为这不是一个足够好的解决方案。
您尝试过订阅 AppDomain.UnhandledException 活动吗?您可以将其用作最终捕获(没有双关语)并记录到文件中的异常见
https://msdn.microsoft.com/en-gb/library/system.appdomain.unhandledexception(v=vs.110).aspx
Alternatively/additionally - 您查看事件查看器了吗?
祝你好运
我这边似乎出现了疏忽,但我仍然不确定这是否是解决我问题的正确方法。
我不太了解整个 ApartmentState 是 MTA 还是 STA,或者如何确定何时应该使用哪个。
解决我的问题的方法是遍历从我的主线程分离出来的所有线程并将它们的 ApartmentState 设置为 STA,我认为这已经从以前的代码行完成以解决我遇到的另一个问题(例如是协作的问题)。
但是,是的,我检查了整个解决方案,发现正在创建新线程的所有实例并将它们的 ApartmentState 显式设置为 STA 解决了崩溃问题。
如果有人能提供一些很好的 material 来定义差异以及何时使用,或者如何确定何时应该使用一个而不是另一个,我们将不胜感激。
我已经经历了不同的问题,并没有真正找到适合我的问题的任何东西,但我也不知道要查找什么才能得到任何结果,所以我可能遗漏了一些条目。如果有人可以 link 提供一些可能有帮助的东西,我将不胜感激。
我将首先发布我正在使用的代码示例(不是确切的代码,因为我无法发布它),我认为它会导致应用程序崩溃。
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 本身。
它的设置方式是在数据网格视图中,单击单元格会弹出一个表单,供您为该特定行添加注释并保存。
弹出表单后,我将其关闭,应用程序立即崩溃且无法恢复,但也没有报告异常。
只有在 运行 到 visual studio 之间才会发生这种情况(无论是发布版本还是调试版本,只有在 [=46= 中是或不是 运行 时才会发生这种情况]).
我确定我可能遗漏了一些细节,如果您需要我提供任何其他信息,请告诉我,但这总结了我的问题。
编辑:
通过一些进一步的调试,我在所有可能与表单关闭、打开和执行预期目的有关的地方添加了多个日志语句。
我发现 FormClosing
事件一直持续到现在。
ShowDialog(this)
预期 return 一个 DialogResult
枚举值,但在它实际尝试 return 这个值时挂起,导致应用程序冻结。
我还发现,将最终调用表单的线程的线程优先级设置为 AboveNormal 可以解决这个问题。但是我认为这不是一个足够好的解决方案。
您尝试过订阅 AppDomain.UnhandledException 活动吗?您可以将其用作最终捕获(没有双关语)并记录到文件中的异常见 https://msdn.microsoft.com/en-gb/library/system.appdomain.unhandledexception(v=vs.110).aspx
Alternatively/additionally - 您查看事件查看器了吗?
祝你好运
我这边似乎出现了疏忽,但我仍然不确定这是否是解决我问题的正确方法。
我不太了解整个 ApartmentState 是 MTA 还是 STA,或者如何确定何时应该使用哪个。
解决我的问题的方法是遍历从我的主线程分离出来的所有线程并将它们的 ApartmentState 设置为 STA,我认为这已经从以前的代码行完成以解决我遇到的另一个问题(例如是协作的问题)。
但是,是的,我检查了整个解决方案,发现正在创建新线程的所有实例并将它们的 ApartmentState 显式设置为 STA 解决了崩溃问题。
如果有人能提供一些很好的 material 来定义差异以及何时使用,或者如何确定何时应该使用一个而不是另一个,我们将不胜感激。