[英]Add a control to Controls property from another thread in C#
我需要向 c# 的后台工作人员的控件添加一个新控件。我尝试使用Type.InvokeMember()
,但我总是出错。 那是我的代码:
private delegate void AddControlThreadSafeDelegate(Control newControl, Control parent);
public static void AddControlThreadSafe(Control newControl, Control parent)
{
if (newControl == null) return;
if (parent == null) return;
if (parent.InvokeRequired)
{
parent.Invoke(new AddControlThreadSafeDelegate(AddControlThreadSafe),
new object[] { newControl, parent });
}
else
{
parent.GetType().InvokeMember("Controls.Add", BindingFlags.InvokeMethod, null, parent, new object[] { newControl });
}
}
错误是
找不到方法“System.Windows.Forms.FlowLayoutPanel.Controls.Add”
如果我改为调用“隐藏”,我不会收到错误消息。 它似乎不起作用,因为该方法不直接属于父级,而是属于它的一个属性。 有谁知道如何解决这个问题或其他方法吗?
您不需要通过创建委托等来执行 Cermony。您可以只使用 lambda:
parent.Invoke(() => parent.Controls.Add(newControl));
在 .net 的旧版本中,您可能需要显式转换:
parent.Invoke((Action)(() => parent.Controls.Add(newControl)));
此外,如果您已经在 UI 线程上,则不必乱用InvokeMember
,只需调用:
parent.Controls.Add(newControl);
请注意,后台 worker 大部分已被 Task 和 async/await 取代,因此现代代码应如下所示:
// gather parameters from the UI
var result = await Task.Run(() => MyBackgroundMethod(myParameter));
// Update UI with the results
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.