【发布时间】:2010-08-20 21:33:51
【问题描述】:
我注意到在涉及线程和 UI 的 Windows 窗体场景中出现了一些奇怪的行为,因此,这自然意味着要使用 InvokeRequired 属性。情况:我的应用程序使用线程做一些工作,线程将事件发送到 UI。 UI 显示基于国际化系统的消息,该系统由带有键的字典组成。 I18N 系统在字典中找不到键而崩溃。
注意:应用程序处于调试模式,我对整个“Application.Run();”进行了尝试捕获回到 Program.cs。但是,没有达到 try-catch,因为我将在这里讨论基于内部异常处理,但我提到它以防万一。
现在有趣的部分来了:
为什么 Visual Studio 会“审查”我的异常信息?在下面的代码中,您将在 if (InvokeRequired) 分支上看到一个 try-catch。我记录了异常。 ex.InnerException 是 NULL 并且提供的 ex.StackTrace 是贫血的(其中只有 1 步)。现在,如果我注释 try-catch 并简单地让它通过调试器崩溃,我会得到一个更丰富的堆栈跟踪。这是为什么?
更糟糕的是,两个堆栈跟踪版本都没有包含有关 i18N 崩溃的任何信息。他们只是说“给定的键不在字典中”。并给我一个调用声明的堆栈跟踪。
在 else 分支上(即 InvokeRequired == false),如果我放了一个 try-catch,我可以成功地将我的异常捕获回i18n 系统。如您所见,我尝试将带有 InnerException 的异常发送回 InvokeRequired == true 分支。然而,即便如此,InnerException 仍然在那里保持 NULL,我无法访问我的 i18N 错误。
我对所有这些事情感到困惑,也许有人可以在这里帮助阐明一下。如果你有非常强大的灯笼,那就是。
这是函数的代码。
private delegate void AddMessageToConsole_DELEGATE (frmMainPresenter.PresenterMessages message);
private void AddMessageToConsole (frmMainPresenter.PresenterMessages message)
{
if (InvokeRequired)
{ //Catching any errors that occur inside the invoked function.
try { Invoke(new AddMessageToConsole_DELEGATE(AddMessageToConsole), message); }
catch (Exception ex) { MSASession.ErrorLogger.Log(ex); }
//Invoke(new AddMessageToConsole_DELEGATE(AddMessageToConsole), message);
}
else
{
string message_text = ""; //Message that will be displayed in the Console / written in the Log.
try
{
message_text = I18N.GetTranslatedText(message)
}
catch (Exception ex)
{
throw new Exception(ex.Message, ex);
}
txtConsole.AppendText(message_text);
}
}
【问题讨论】:
-
#2 有点令人困惑。既不和不意味着两个例外都提供有关 i18N 崩溃的信息。我认为您的意思是说这两个例外都没有提供该信息。你可能想改写它。对不起,如果我是一个语法纳粹:P
-
True ::- D. 我更新了,抱歉!
-
有什么办法可以让更多人看到我的问题吗? ::- >.
标签: c#