0

Winform アプリケーション。バックグラウンド スレッドは MQ からメッセージを取得し、UI スレッドで変更を行います。

カスタムリストを更新するには、このメソッドを呼び出す必要があります

    private void UpdateList()
    {         
        if (ctrlLabel.IsHandleCreated)
        {
            ctrlLabel.Invoke(new Action(() =>
            {
                //Do Something
            }
            ));
        }

        ctrlListView.Data = package;

       //MARK
       ctrlListView.Invoke(new Action(() =>
        {
            ctrlListView.LoadData();
        }
        )); 
       //MARK           
    }

このメソッドは、バックグラウンド スレッドによって 2 回とも呼び出されます。ただし、これは、コントロールが新たにインスタンス化された後の最初の呼び出しでは機能します。

アイテムを削除して更新しようとすると、Null Exception Errors でエラーが発生します。

興味深いことに、いくつかの小さな変更でこれを実行できました。[Control].Invoke を単に Invoke に変更したところ、機能しました (2 回目の呼び出しのみ)。

       //MARK
       Invoke(new Action(() =>
        {
            ctrlListView.LoadData();
        }
        )); 
       //MARK           

では、Invoke と [control].Invoke はどのように動作が異なるのでしょうか?

Win7、.Net 4.0 で見られる

4

1 に答える 1

2

[control].Invokeその特定のコントロールに固有の呼び出しを使用すると、現在のフォームがどれであるInvokeかを参照します。this

そう:

   Invoke(new Action(() => ....

上記は次のようになります。

this.Invoke(new Action(() => ....

this現在のフォームはどこにありますか。

アイテムを削除して更新しようとすると、Null Exception Errors でエラーが発生します。

コントロールがnull原因であるdelete場合は、NRE を取得します。

于 2013-01-30T05:33:48.277 に答える