我有一个可供全球客户使用的程序。我检查了我的错误日志,似乎有很多异常(下面列出)被抛出,我无法真正找出或跟踪。
我有一些调用,但是它们都受InvokeRequired保护。
现在我在想,如果我应该使用if(HandleCreated)代替。
我什至不知道在哪里或何时引发异常。
在启动过程中,在InitializeComponent();之后,我有一些任务需要访问某些控件,例如datagridview。但是,就像我说的,我尝试使用InvokeRequired保护它们。我不确定是不是引起问题的地方。
我可以执行哪些建议,以便尝试查找此问题?
无论如何,这是我的例外:
System.InvalidOperationException: Invoke or BeginInvoke cannot be called on a
control until the window handle has been created.
at System.Windows.Forms.Control.WaitForWaitHandle(WaitHandle waitHandle)
at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate
method, Object[] args, Boolean synchronous)
at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
at System.Windows.Forms.Control.Invoke(Delegate method)
at ..()
at ..()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,
ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
最佳答案
不,如果使用InvokeRequired,则不会发生这种情况。仅当句柄有效时,它才为真。无论如何,都非常简单地避免,只是不要订阅事件或在Load事件触发之前启动线程。
窗体关闭时,将发生此崩溃。您无法在堆栈跟踪中看到的东西,因为那发生在另一个线程上。 InvokeRequired + Begin / Invoke()中存在竞争条件。 InvokeRequired可能会返回true,并在一毫秒后关闭表单。您的Begin / Invoke调用将因此异常而失败。
这不是您可以解决的比赛。您必须确保在关闭窗体之前,线程不能再调用BeginInvoke()。这总是意味着您必须防止表单关闭。背景信息位于this answer中。