4

別のスレッドからの UI スレッドの更新に関する手法を知っています。

これら 2 つの方法/テクニックがありますが、どちらを使用すればよいですか?

タスクの使用:

var uiTask = Task.Factory.StartNew(() => {
  // change something on ui thread
  var action = theActionOnUiThread;
  if (action != null) {
    action();
  }
}, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());

ディスパッチャの使用:

Dispatcher.CurrentDispatcher.BeginInvoke(
  new Action(() => {
    // change something on ui thread
    var action = theActionOnUiThread;
    if (action != null) {
      action();
    }
  }));
4

2 に答える 2

2

技術的な観点からは、ここに「最高」があるとは思えません。ただし、ディスパッチャのアプローチを使用します。

  • それはあなたの意図をより明確にします。つまり、メインのUIスレッドで何かをやりたいということです
  • すべてのタスク ファクトリ オプションをいじる必要はありません
  • Dispatcher を使用すると、インターフェイスの背後にあるすべてのものを簡単に隠すことができます (1) 依存関係の挿入と単体テストが容易になります

(1)例はこちらをご覧ください

于 2012-12-15T21:12:27.060 に答える
1

TaskScheduler.FromCurrentSynchronizationContext()TaskSchedulerは、UI スレッドの を返すことを保証しません。

実際には を返すこともありますnullが、これらのケースはまれであり、通常はネイティブ アプリ (WIX ブートストラップなど) で独自のディスパッチャーをスピンアップする必要があります。

したがって、ディスパッチャー版を使用する方が安全だと思います。

于 2012-12-17T09:03:08.053 に答える