我有一个全局客户都在使用的程序。我检查了我的错误日志,发现有相当多的错误日志似乎抛出了异常(如下所列),但我无法真正弄清楚或跟踪。
我有一些调用,但它们都受 InvokeRequired 保护。 现在我在想,如果我应该使用 if (HandleCreated) 代替。
我什至不确定抛出异常的地点和时间。
在启动时,在 InitializeComponent(); 之后,我有一些任务需要访问某些控件,例如 datagridview。但是,正如我所说,我尝试使用 InvokeRequired 来保护它们。我不确定那是否是导致问题的地方。
我可以执行哪些建议来尝试跟踪这个问题?
无论如何,这是我的异常(exception):
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,则不会发生这种情况。只有当 Handle 有效时才会为真。无论如何都非常简单地避免,只是在 Load 事件触发之前不要订阅事件或启动线程。
此崩溃发生在表单关闭 时。你在堆栈跟踪中看不到的东西,因为它发生在另一个线程上。 InvokeRequired + Begin/Invoke() 中存在竞争条件。 InvokeRequired 可能会返回 true,并在一微秒后关闭表单。您的 Begin/Invoke 调用将因此异常而失败。
这不是您可以解决的比赛。在允许窗体关闭之前,您必须确保线程不能再调用 BeginInvoke()。这总是意味着您必须防止关闭表单。背景信息在 this answer 中.
关于c# - 无法调用 Invoke 或 BeginInvoke 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15891319/