UPDATE
从C#6开始,这个问题的答案是:
SomeEvent?.Invoke(this, e);
Run Code Online (Sandbox Code Playgroud)
我经常听到/阅读以下建议:
在检查事件之前,请务必复制事件null并将其触发.这将消除线程的潜在问题,其中事件变为null位于您检查null和触发事件的位置之间的位置:
// Copy the event delegate before checking/calling
EventHandler copy = TheEvent;
if (copy != null)
copy(this, EventArgs.Empty); // Call any handlers on the copied list
Run Code Online (Sandbox Code Playgroud)
更新:我从阅读中了解到这可能还需要事件成员的优化,但Jon Skeet在他的回答中指出CLR不会优化副本.
但同时,为了解决这个问题,另一个线程必须做到这样的事情:
// Better delist from event - don't want our handler called from now on:
otherObject.TheEvent -= OnTheEvent;
// Good, now we can be certain that OnTheEvent will not run...
Run Code Online (Sandbox Code Playgroud)
实际的顺序可能是这种混合物:
// Copy the event delegate before checking/calling
EventHandler copy …Run Code Online (Sandbox Code Playgroud) 这是Winforms中的错误吗?(在VS2008和VS2010上测试)
private void Form1_Load(object sender, EventArgs e)
{
throw new Exception("Hey");
}
Run Code Online (Sandbox Code Playgroud)
我没有在那段代码中收到任何错误,前一段时间,我正在尝试为这个问题制定解决方案从一个字符串中解析一个数字,其中包含非数字
我在Form1_Load中执行此代码:
private void Form1_Load(object sender, EventArgs e)
{
MessageBox.Show("X");
string s = "12ACD";
string t = s.ToCharArray().TakeWhile(c => char.IsDigit(c)).ToArray().ToString();
MessageBox.Show("Y");
int n = int.Parse(t);
MessageBox.Show(n.ToString());
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么它没有显示数字.然后将代码移动到button1_Click ...
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("X");
string s = "12ACD";
string t = s.ToCharArray().TakeWhile(c => char.IsDigit(c)).ToArray().ToString();
MessageBox.Show("Y");
int n = int.Parse(t);
MessageBox.Show(n.ToString());
}
Run Code Online (Sandbox Code Playgroud)
...然后我注意到有一个错误:输入字符串的格式不正确.
为什么Form1_Load没有捕获任何异常,为什么它会默默地失败?代码刚刚退出form1_load at string t = s.ToCharArray().TakeWhile ...