jtp*_*yda 4 c# event-handling thread-safety
阅读此问题后,似乎以下代码应该失败:
private void Form1_Load(object sender, EventArgs e)
{
EventHandler myHandler = null;
myHandler(this, null);
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,它运行得很好(并且什么都不做).该代码的行为与以下内容有何不同?
private void Form1_Load(object sender, EventArgs e)
{
EventHandler myHandler = null;
EventHandler myCopy = myHandler;
if (myCopy != null)
{
myHandler(this, null);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:根据Lasse V. Karlsen的回答,以这种方式捕捉异常是有效的:
private void Form1_Load(object sender, EventArgs e)
{
try
{
EventHandler myHandler = null;
myHandler(this, null);
}
catch (Exception ex)
{
this.Text = "Exception!";
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是Load事件吞噬了你的异常.
此处还有其他关于此问题和网上其他帖子的问题:
简而言之,在某些情况下(最常提到的原因是在64位Windows上运行的32位.NET程序),任何WinForms表单的Load事件中的异常都将被吞噬.
您可以将Form Load事件包装在try/catch块中以捕获它,并确定如何对其作出反应.
简而言之2:代码确实会引起您所期望的空引用异常,您只是没有看到它