2

我有我的用户控制权。我将这些用户控件(100 个或更多)的集合添加到面板中。而这个面板又被添加到主窗体中。所有这些都是在运行时完成的。由于有这么多用户控件,我的主窗体在添加这些用户控件之前没有响应。

我想知道我是否可以先将面板添加到表单中,然后从单独的线程创建我的用户控件并将它们添加到同一个面板,因此我的主表单始终可供用户使用。我所有的努力导致:

“跨线程操作无效”错误。

如果有人可以帮助我,我会很高兴。

这是我现在正在做的事情

void main(){
    MyPanel pnlObj = new MyPanel();
    this.Controls.Add(pnlObj);
}

Class MyPanel{

    public void Panel()
    {
        MyUserControl uc1 = new MyUserControl();
        MyUserControl uc2 = new MyUserControl();
        this.Add(uc1);
        this.Add(uc2);
    }
}
4

2 回答 2

5

您不能在非 UI 线程中使用视觉元素,对此感到抱歉。

但是您可以做的是在非 UI 线程中创建所有必要的数据,并将创建 UI 元素和更新 UI 委托给 UI 线程。

这看起来像这样:

// in background thread
ComputeDataSlowly();
MainForm.Invoke(() =>
{
    var control = CreateNewControlFromData();
    MainForm.Add(control);
});
于 2012-09-09T14:12:26.790 回答
3

我不确定您的问题是否有解决方案。只有 GUI 线程可以更新控件,因此即使您确实使用了额外的线程,您仍然必须通过 将创建/添加控件的工作转发到 GUI 线程Invoke/BeginInvoke,这又会导致您原来的问题。

于 2012-09-09T14:14:46.707 回答