【发布时间】: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