gpt4 book ai didi

c# - 即使在 UI 线程上执行时也可以跨线程操作

转载 作者:行者123 更新时间:2023-12-03 12:48:42 28 4
gpt4 key购买 nike

我有一个函数,可以将控件添加到父控件,该函数是从与创建控件的线程不同的线程调用的。事情是这样的:

1        delegate void AddControlToParentDelegate(Control child, Control parent);
2 private void addControlToParent(Control child, Control parent) {
3 if (parent.InvokeRequired) {
4 AddControlToParentDelegate d = new AddControlToParentDelegate(addControlToParent);
5 this.Invoke(d, new object[] { child, parent });
6 } else {
7 parent.Controls.Add(child);
8 }
9 }
10 }

parent.InvokeRequiredchild.InvokeRequired 都为 TRUE 之前,此方法可以正常工作。然后,一旦执行第 5 行(现在委托(delegate) d 被调用,并且该函数应该在 UI 线程上运行。(对吗?))第 7 行的 child抛出跨线程操作无效异常。为什么是这样?它不是已经在它创建的线程上运行了吗?

我设法通过添加额外的 (child.InvokeRequired) 检查来解决此问题:

delegate void AddControlToParentDelegate(Control child, Control parent);
private void addControlToParent(Control child, Control parent) {
if (parent.InvokeRequired) {
AddControlToParentDelegate d = new AddControlToParentDelegate(addControlToParent);
this.Invoke(d, new object[] { child, parent });
} else {
if (child.InvokeRequired) {
this.Invoke(new MethodInvoker(delegate() {
parent.Controls.Add(child);
}));
} else {
parent.Controls.Add(child);
}
}
}

但这看起来非常糟糕并且没有必要。这是这样做的方法吗?或者我完全错过了公共(public)汽车?

最佳答案

请注意,当控件没有窗口句柄时,InvokeRequired 不可靠。对于新创建的还没有父级的子控件来说,几乎肯定会出现这种情况,这似乎是“固定”代码中的情况。

参见Ivan Krivyakov的详分割析:http://www.ikriv.com/en/prog/info/dotnet/MysteriousHang.html

关于c# - 即使在 UI 线程上执行时也可以跨线程操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3314561/

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