我正在存储我的数据模型的状态。我克隆数据模型,然后希望将其异步写入“磁盘”。
我应该使用在后台线程上运行它的 Task.Run() 吗?或者我应该让它成为一个异步函数而不是等待它?(这将使它在 UI 线程上运行)
与此类似的东西,但我的问题有点不同: async Task.Run with MVVM
决定选择哪一个的标准是什么?
谢谢!
我正在存储我的数据模型的状态。我克隆数据模型,然后希望将其异步写入“磁盘”。
我应该使用在后台线程上运行它的 Task.Run() 吗?或者我应该让它成为一个异步函数而不是等待它?(这将使它在 UI 线程上运行)
与此类似的东西,但我的问题有点不同: async Task.Run with MVVM
决定选择哪一个的标准是什么?
谢谢!
您应该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;
}
我不认为这很重要。据我所知,这两种方法都被分派到线程池中的一个线程。
使用async
将使异步方法在后台线程上运行,并在异步方法完成时继续在启动它的线程上。您可以想象编译器看到 await 关键字,将 awaited 方法放在后台线程中并连接事件以通知异步方法何时完成。因此,如果您因为成功保存而想要显示 UI 更改,这可能是更好的选择,因为这当然是更少的代码。
Task.Run()
当您出于任何原因不想将代码放入async
方法中时会更好,例如因为您希望调用方法本身不是异步的。此外,涉及较少的事件编组,但我严重怀疑是否存在任何性能差异。