gpt4 book ai didi

.net - 不可能(我讨厌使用这个词)交叉线程错误?

转载 作者:行者123 更新时间:2023-12-04 13:35:50 24 4
gpt4 key购买 nike

任何人都可以解释这可能如何发生吗?

我完全了解编程时要牢记线程安全性,并且正如您所看到的,我通过此处的InvokeRequired表单来满足UI更新的要求,一切工作正常,并且没有任何更改可以打破我所知道的状态,现在突然之间我正在对应用程序的其他部分进行编程(也许是在某个阶段添加到此方法?我只是不记得了),我很自然地收到此错误:

首先,如果InvokeRequired = true,则意味着执行BeginInvoke(),方法将被[排队]重新调用,并且InvokeRequired应该等于false吗?

我不应该收到此异常(exception),因为它应该得到满足?

希望听到一些多线程专家的意见:)

格雷厄姆

最佳答案

我怀疑InvokedRevoked可能对您撒谎。 WinForm控件推迟创建控件的基础Win32 HWND,直到方法调用实际需要它为止。如果尚未创建HWND,则InvokeRequired将返回false。

有关详细说明,请参见:"Mysterious Hang or The Great Deception of InvokeRequired"

如果您的后台线程在UI线程导致控件延迟创建其HWND之前查询InvokeRequired,则InvokeRequired将(错误地)告诉您的后台线程它不需要使用Invoke()将控件传递回UI线程。当后台线程访问控件时,BAM! “InvalidOperationException:跨线程操作无效!”

UI线程可以手动强制Control创建其HWND句柄,以便Control.InvokeRequired将知道UI线程是Control的所有者:

Control control = new Control();
IntPtr handle = control.Handle; // if you ask for HWND, it will be created

关于.net - 不可能(我讨厌使用这个词)交叉线程错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/527198/

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