2017-02-11 6 views
1

私は本当に奇妙な問題を抱えています。私はバックグラウンドワーカーのdoworkイベントの中でコンボボックスからデータを取得しようとしています。BackgroundWorkerのComboBoxのデータへのアクセス

if (this.sortBox.SelectedItem.ToString() != "Friends" && this.sortBox.SelectedItem.ToString() != "Spotify") 
//sortBox = ComboBox 

これは問題です。それはちょうどそこに行かない、それは本当である。これを通常の無効状態でチェックしたところ、それはうまくいったので、ちょうどdoworkイベントに入っています。しかし、どうやってこれを呼び出すのですか?私は、私がUi上のオブジェクトを修正しようとするときに呼び出さなければならないと思っていました。誰かが少しこれをクリアすることができるなら、本当に変だと私はうれしいだろう!

答えて

0

Windowsフォームにアクセスする方法を覚えていないディスパッチャを使用する必要があります(レガシーテクノロジであり、10年近く触れていません)。 WPFには静的なApplicationクラスがありますが、ViewModel(またはWindows Formsの場合はPresenter)ユニットをテスト可能にするために、注入可能なインターフェイスとして公開する必要があります。

0

ベストプラクティスは、BackgroundWorkerを起動してUIから独立して実行できるように、長期実行タスクに必要なデータ(サンプルが正しい場合は単純な文字列)を渡すだけです。

あなたは本当にあなたがこのようにそれを行うことができワーカースレッドからUIにアクセスする場合:

string result = null; 
Action accessUI =() => result = sortBox.SelectedItem.ToString(); 
if (InvokeRequired) 
    Invoke(accessUI); // this will run from the worker thread 
else 
    accessUI(); // and this one from the UI thread (direct access) 
return result; 
0

別のバージョン:

 string value = ""; 
     sortBox.Invoke(new MethodInvoker(delegate { 
      if (sortBox.SelectedIndex != -1) 
      { 
       value = sortBox.SelectedItem.ToString(); 
      } 
     })); 
     Console.WriteLine("value = " + value); 
関連する問題