gpt4 book ai didi

c# - 使用 2 个表单时是否需要两次单独的 InvokeRequired 检查?

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

给定

Action closeLoadingAction = new Action(() =>
{
loadingForm.Close();
#region - may need to put into second Action
panelOnMainForm.Controls.AddRange(physdocControls.ToList<Control>().ToArray());
if (Handle != IntPtr.Zero)
User32DLL.SetForegroundWindow(this.Handle);//Handle is a property of the mainForm.
#endregion
});

有时我会收到 handle not created 异常,即使我检查了所需的 Invoke。

if(loadingForm.InvokeRequired)
loadingForm.Invoke(closeLoadingAction);
else
closeLoadingAction();

加载表单与主表单在同一个线程上运行。您在上面看到的代码在单独的线程中运行。我怀疑我需要对主窗体进行另一次调用检查。我需要第二次检查还是我已经安全了?

最佳答案

The code you see above runs in a seperate thread

当您知道代码在另一个线程上运行时,像这样使用 InvokeRequired 是一种糟糕的反模式。你可以用它做更多有用的事情。喜欢:

if (!loadingForm.InvokeRequired) {
throw new InvalidOperationException("Threading race detected");
}
loadingForm.Invoke(closeLoadingAction);

如果您打算在加载表单的 Load 事件触发之前启动加载线程,或者更实用的方法:

while (!loadingForm.InvokeRequired) Thread.Sleep(50);
loadingForm.Invoke(closeLoadingAction);

或者以正确的方式进行,让表单的 Load 事件启动线程。

关于c# - 使用 2 个表单时是否需要两次单独的 InvokeRequired 检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13243291/

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