繁体   English   中英

在 C# 中从另一个线程向 Controls 属性添加控件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM