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 关键字,将 awaited 方法放在后台线程中并连接事件以通知异步方法何时完成。因此,如果您因为成功保存而想要显示 UI 更改,这可能是更好的选择,因为这当然是更少的代码。

Task.Run()当您出于任何原因不想将代码放入async方法中时会更好,例如因为您希望调用方法本身不是异步的。此外,涉及较少的事件编组,但我严重怀疑是否存在任何性能差异。

于 2012-12-13T07:53:54.080 回答