【问题标题】:"Invoke or BeginInvoke cannot be called..." when closing a window关闭窗口时“无法调用 Invoke 或 BeginInvoke...”
【发布时间】:2012-03-26 13:19:36
【问题描述】:

好的,关于这个错误有很多问题,但我似乎无法找到解决我的问题的方法。我有一个线程在长时间运行的操作期间从数据库加载控件。如果我在该线程完成之前关闭窗口,它会在执行Invoke 时抛出Invoke or BeginInvoke cannot be called on a control until the window handle has been created.

我已将代码修改为如下所示:

If Not Me.IsDisposed And Me.Created And Me.IsHandleCreated Then '
      Me.Invoke(New AddImageDelegate(AddressOf AddImage), item.PartNo, New Bitmap(item.ImagePath))
      Me.Invoke(New SetImageDelegate(AddressOf SetImage), I, item.PartNo)
End If

但是它仍然到达Invoke 行并引发错误。当调试因异常停止时,IsDisposed 为真,.Created 为假,.IsHandleCreated 为假。所以检查这些属性没有帮助。

那么...在这种情况下,我该如何防止它运行调用行?

【问题讨论】:

标签: vb.net multithreading invoke invalidoperationexception


【解决方案1】:

可能是在您的表单关闭之前调用了 Invoke?

如果我建议在您设法停止第二个线程之前不要关闭您的表单,而不是这样做,它更安全。

【讨论】:

  • 当用户关闭父窗口时窗体关闭,线程属于嵌套在窗体某处的控件。控件是否有一种简单的方法来防止表单关闭?
  • 如果不进行测试,我相信您可以捕获 onformclosing 事件 (msdn.microsoft.com/en-us/library/…) 并设置“e.Cancel = true”。这应该取消关闭。或者您可以在子表单“IsClosable”上创建一个属性,然后等到您的第二个线程将其设置为 true。您甚至可以在 Closing 事件中阻塞父线程,直到第二个线程完成。
猜你喜欢
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多