我正在存储我的数据模型的状态。我克隆数据模型,然后想要异步写入“磁盘”。
我应该使用在后台线程上运行它的Task.Run()吗? 或者我应该让它成为异步功能而不是等待它? (这将使其在UI线程上运行)
与此类似,但我的问题有点不同: async Task.Run with MVVM
决定选择哪个标准是什么?
谢谢!
答案 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
会更好,例如因为你希望调用方法本身不是异步的。此外,还有较少的事件编组,但我非常怀疑存在任何性能差异。