gpt4 book ai didi

c# - 无法调用 Invoke 或 BeginInvoke 错误

转载 作者:太空宇宙 更新时间:2023-11-03 13:44:20 25 4
gpt4 key购买 nike

我有一个全局客户都在使用的程序。我检查了我的错误日志,发现有相当多的错误日志似乎抛出了异常(如下所列),但我无法真正弄清楚或跟踪。

我有一些调用,但它们都受 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com