2017-06-27 9 views
2

たとえば、textBox UI要素のテキストをTask.Run()メソッドに渡すにはどうすればよいですか?このコードは例外をスローします(...他のスレッドが所有しています)。私はフィルタのvariabeleを渡すと、例外がなくなった、これは文字列が値として渡されるためですか?Task.Run()他のスレッドが所有するオブジェクトを渡す方法は?

private async void filterTextBox_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    if (currentSession.SessionFilenames != null) 
    { 
     string filter = filterTextBox.Text; 
     dirListing.ItemsSource = await Task<IEnumerable<string>>.Run(()=> Filterfiles(filterTextBox.Text)); 
    } 
} 
+2

はい、そのケースは –

+2

です。それは基本的にはいです:-)詳細はこちら[こちら](https://stackoverflow.com/a/30120785/1132334)をご覧ください。しかし、逆のことは当てはまりません。テキストボックスは[UIスレッドのコントロール]であるため、テキストボックスで失敗します(https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to -make-thread-safe-calls-to-windows-forms-controls)を使用しています。 – dlatikay

答えて

3

あなたは、そのオブジェクトを所有しているもの以外のスレッドでスレッドの親和性(例えばTextBoxオブジェクトなど)を持つオブジェクトを使用することはできません。

しかしほとんどのオブジェクトは、スレッドアフィニティを持っていません。は、スレッドアフィニティを持っていません。それらは特定のスレッドによって所有されておらず、どこでも使用できます。これには、filterローカル変数に格納するfilterTextBox.Textによって返されたstringオブジェクトが含まれます。あなたはどちらかTask.Run()メソッド呼び出しの型パラメータを指定する必要はありません

dirListing.ItemsSource = await Task.Run(()=> Filterfiles(filter)); 

注:

だから、だけではなく、その値を使用します。コンパイラは、呼び出しで使用された式に基づいて型を推論します。

関連する問題