什么时候应该使用Task.Run()而不是等待?

时间:2012-12-13 07:05:42

标签: c# asynchronous windows-runtime windows-store-apps

我正在存储我的数据模型的状态。我克隆数据模型,然后想要异步写入“磁盘”。

我应该使用在后台线程上运行它的Task.Run()吗? 或者我应该让它成为异步功能而不是等待它? (这将使其在UI线程上运行)

与此类似,但我的问题有点不同: async Task.Run with MVVM

决定选择哪个标准是什么?

谢谢!

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

我认为这不重要。据我所知,这两个方法都被分派到线程池中的一个线程。

使用async使异步方法在后台线程上运行,并在异步方法完成时继续启动它的线程。您可以想象编译器看到await关键字,将等待的方法放在后台线程中,并在asynch方法完成时连接事件以通知。因此,如果您想要因成功保存而显示UI更改,这可能是更好的选择,因为这当然是较少的代码。

当你出于任何原因不想将代码放在Task.Run()方法中时,

async会更好,例如因为你希望调用方法本身不是异步的。此外,还有较少的事件编组,但我非常怀疑存在任何性能差异。