我有一个表单打开并连接到一个带有后台工作程序的现有计算对象。完成后台工作程序后,将发送一条消息,表单将运行OnCompletion方法。如果计算失败,该方法将创建一个消息框。让我们假设计算失败。然后,用户将收到有关失败的消息。现在我们关闭表单,打开表单的新实例,然后再次运行计算。计算再次失败,表单运行OnCompletion方法并在消息框中崩溃。
MessageBox.Show(this, message, title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
问题在于“这个”(形式)被放弃了。如果更改代码以测试IsDiposed:
if (!IsDisposed)
MessageBox.Show(this, message, title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
然后消息框没有被调用,但是我看到我的OnCompletion方法第二次立即运行,IsDiposed现在是假的,并且消息框被正确调用。
虽然我测试表单是否已经解决问题,但我认为如果我的OnCompletion方法被调用两次,我必须做错了。
请注意,仅在原始表单已关闭时才会发生对OnCompletion的双重调用。之后,每次运行计算时,OnCompletion方法都会被调用两次,而this.IsDiposed第一次为true而第二次为false。
任何人都有解释或建议停止对OnCompletion的双重调用。