2

これまで、Invokeメソッドを使用して別のスレッドからリストボックスオブジェクトにアイテムを設定する方法の例を1000個見てきました。

ただし、バックグラウンドワーカーのトレッドからリストボックスからアイテムを単純に読み取る方法についての解決策は見つかりません。たとえば、SelectedItemsを読み取る前にこれを呼び出すにはどうすればよいですか...

foreach (var item in CheckedListBox1.SelectedItems)
{
 //Do something
}

バックグラウンドワーカーで実行されている上記のコードは、次のエラーを生成しました。

クロススレッド操作が無効です:コントロール'CheckedListBox1'は、それが作成されたスレッド以外のスレッドからアクセスされました。

4

2 に答える 2

1

同様に、バックグラウンド スレッドから UI 要素Invoke読み取るために使用できます。

var selectedItems = (IList)this.Invoke(new Func<IList>(() =>
    CheckedListBox1.SelectedItems.Cast<object>().ToList()));

foreach (var item in selectedItems)
{
    //Do something
}

アイテムのタイプがわかっている場合は、Cast呼び出しでタイプを指定してIList<YourType>、非ジェネリックではなくを返すことができますIList

于 2012-06-04T11:06:46.010 に答える
1

UI オブジェクトへの参照が必要です。次に、このコード (.NET 4.0) を使用して、メイン スレッドにある Application.Current Pointer を使用できるため、参照がない場合にメイン スレッドで何かを呼び出すことができます。

Application.Current.Dispatcher.BeginInvoke((ThreadStart)delegate
{
    // TODO: Implement task to do on main thread
    foreach (var item in CheckedListBox1.SelectedItems)
    {
         //Do something
    }
});
于 2012-06-04T11:10:34.307 に答える