我了解了一些有关异步等待模式的知识,我认为我在某种程度上了解它。我知道它们用于避免阻塞UI,并且主要用于IO操作(如数据库或文件访问)中。 我现在正在尝试重构几个MVC操作方法以使其异步。虽然数据库访问非常合理(例如EF的ToListAsync()),但我对View模型的生成以及如何(或是否应该)异步存在疑问。
考虑到我有一个像这样的方法(我相信MVC中相当标准的方法):
public PartialViewResult DoSomething()
{
var dataFromDb = _dataService.GetSomeData();
var viewModel = Data2DataViewModel(dataFromDb);
return PartialView("_SomePartialView", viewModel);
}
我可以将其更改为:
public async Task<PartialViewResult> DoSomethingAsync()
{
var dataFromDb = await _dataService.GetSomeDataAsync();
var viewModel = Data2DataViewModel(dataFromDb);
return PartialView("_SomePartialView", viewModel);
}
那很好,但这是我的问题:
我的方法Data2DataViewModel
是否也应通过异步操作?
如果是的话,如果它主要是
public ViewModel Data2DataViewModel(DataFromDB dataFromDb)
{
DataViewModel result = new DataViewModel()
{
Prop1 = dataFromDb.Prop,
Prop2 = dataFromDb.SomeOtherProp
};
return result;
}
通常,它只需要从数据库中获取已加载的数据并填写VM的属性即可。因此,不涉及任何IO操作。 据我了解,只有IO操作才应该是异步的,因为它们实际上可能会阻塞UI。 但是我的应用程序中90%的数据库操作所需时间不到0.5秒,因此我开始怀疑使方法异步实际上是否对我有所帮助,以及我的理解和思考是否真正有意义。 所有答案表示赞赏!
答案 0 :(得分:1)
用于避免阻止用户界面
对于GUI应用程序,async
是避免阻塞UI线程的好方法。对于ASP.NET应用程序(如您发布的代码),async
用于获得更大的可伸缩性。没有UI线程可解除阻止。有关更多信息,请参见async ASP.NET,尤其是“异步代码不是灵丹妙药”下的第二段。
我的方法Data2DataViewModel也应该通过异步吗?
该方法是否执行任何异步操作?如果是这样,它应该是异步的。如果没有,那么它应该是同步的。
它所做的无非就是从数据库中获取已加载的数据并填写VM的属性。因此不涉及任何IO操作。
复制属性是完全同步的,因此该方法应该是同步的。