【发布时间】:2012-04-10 07:21:45
【问题描述】:
我必须从线程中关闭一个窗体,并且我正在使用窗体的 Invoke 方法来调用 Close() 方法。
问题是,当关闭时,表单被释放,我得到一个 InvalidOperationExecption 和消息“在创建窗口句柄之前不能在控件上调用 Invoke 或 BeginInvoke。”。
我只有在使用 Close 方法中的“Step Into”进行调试时才遇到此异常,但我不想冒在正常运行时可能出现错误的风险。
这是一个重现它的示例代码:
private void Form1_Load(object sender, EventArgs e)
{
Thread thread = new Thread(CloseForm);
thread.Start();
}
private void CloseForm()
{
this.Invoke(new EventHandler(
delegate
{
Close(); // Entering with a "Step Into" here it crashes.
}
));
}
表单在自动生成的表单代码中处理(我不想修改):
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
如果有人能给我一个解决方案来解决这个问题或以其他方式从另一个线程关闭表单,我将不胜感激。
【问题讨论】:
-
发布的代码没有重现,我没想到会有。此异常的一般原因是您的线程在表单已经关闭之后继续调用 Begin/Invoke 。 stackoverflow.com/questions/1731384/…
-
无法用您提供的代码重现异常
-
它很容易重现,只需使用“Step Into”选项并确保它在离开 Invoke 方法之前进入 Dispose 方法(也许断点会有所帮助)。
-
@HansPassant 虽然在这篇文章中他们没有给出答案,但就我而言,仅仅因为我的线程在表单必须关闭时完成,我已经看到我可以使用 BackgroundWorker 并在它的 RunWorkerCompleted 事件调用 Close() 没有 Invoke 方式。谢谢。问题仍然悬而未决...
标签: c# multithreading winforms invoke