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 に答える