1

データモデルの状態を保存しています。データ モデルのクローンを作成し、非同期で「ディスク」に書き込みたいと考えています。

バックグラウンド スレッドで実行する Task.Run() を使用する必要がありますか? それとも、それを非同期関数にして、それを待つ必要はありませんか? (これにより、UI スレッドで実行されます)

これと同様のものですが、私の質問は少し異なります: async Task.Run with MVVM

また、どちらを選ぶかの判断基準は何ですか?

ありがとう!

4

2 に答える 2

2

Task.Runスレッドプールスレッドで実行するCPUベースの作業に使用する必要があります。

あなたの状況では、UIをブロックせずにI / Oベースの作業を行いたいので、Task.Run何も得られません(非同期I / O APIが利用できない場合を除く)。

ちなみに、あなたは間違いなくこの仕事をたいと思っています。awaitこれにより、エラー処理がはるかにクリーンになります。

したがって、このようなもので十分です。

async void buttonSaveClick(..)
{
  buttonSave.Enabled = false;

  try
  {
    await myModel.Clone().SaveAsync();
  }
  catch (Exception ex)
  {
    // Display error.
  }

  buttonSave.Enabled = true;
}
于 2012-12-13T12:29:38.433 に答える
1

関係ないと思います。私の知る限り、両方のメソッドがスレッド プール内のスレッドにディスパッチされます。

を使用asyncすると、非同期メソッドがバックグラウンド スレッドで実行され、非同期メソッドが終了したときにそれを開始したスレッドで続行されます。コンパイラが await キーワードを認識し、待機中のメソッドをバックグラウンド スレッドに配置し、イベントを接続して、非同期メソッドが終了したときに通知することを想像できます。したがって、保存が成功したために UI の変更を表示したい場合は、これがより良い選択になる可能性があります。

Task.Run()asyncたとえば、呼び出し元のメソッド自体を非同期にしたくないなど、何らかの理由でコードをメソッドに入れたくない場合に適しています。また、関連するイベント マーシャリングも少なくなりますが、パフォーマンスにまったく違いがあるとは思えません。

于 2012-12-13T07:53:54.080 に答える