データベースから製品を取得するタスクがあり、一部のUI変更を処理するアクションがContinueWith
なので、タスクが新しいスレッドを作成し、UIの変更がUIスレッドで実行されなかったため問題が発生しました。TaskScheduler.CurrentとTaskScheduler.FromCurrentSynchronizationContext()の違いは?
私は、この修正プログラムを使用してみました:
var currentScheduler = TaskScheduler.Current;
Task.Factory.StartNew(() =>
{
// get products
}).ContinueWith((x) => handleProductsArrived(x.Result, x.Exception), currentScheduler);
をそれがまったく機能しませんでした。私はチェックし、ContinueWith
はcurrentSchedulerのスレッドではなく別のスレッドで実行されました。
私はこの方法を発見:
Task.Factory.StartNew(() =>
{
// get products
}).ContinueWith((x) => handleProductsArrived(x.Result, x.Exception), TaskScheduler.FromCurrentSynchronizationContext());
をし、それが動作します。違いは何ですか?なぜ私の最初のコードは動作しませんでしたか? ありがとう! TaskScheduler.Current
のドキュメントから
これは、UIコンポーネントのコンストラクタでasync/await likeを使用できない場合に便利です。 – Chin
@Chin:私は特にそれを使用しません - 私は一般的に作業を行い、その後、高速なコンストラクタを呼び出す静的非同期メソッドを持っています。 –
もう少し詳しく説明できますか?特に私は別の質問があります:http://stackoverflow.com/questions/31886276/handle-exception-when-using-task-run-in-ui-constructorそれはちょっと関連しています – Chin