非IO方法(例如,在创建视图模型时)是否应该异步?

时间:2019-06-25 00:30:16

标签: c# asp.net-mvc asynchronous

我了解了一些有关异步等待模式的知识,我认为我在某种程度上了解它。我知道它们用于避免阻塞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秒,因此我开始怀疑使方法异步实际上是否对我有所帮助,以及我的理解和思考是否真正有意义。 所有答案表示赞赏!

1 个答案:

答案 0 :(得分:1)

  

用于避免阻止用户界面

对于GUI应用程序,async是避免阻塞UI线程的好方法。对于ASP.NET应用程序(如您发布的代码),async用于获得更大的可伸缩性。没有UI线程可解除阻止。有关更多信息,请参见async ASP.NET,尤其是“异步代码不是灵丹妙药”下的第二段。

  

我的方法Data2DataViewModel也应该通过异步吗?

该方法是否执行任何异步操作?如果是这样,它应该是异步的。如果没有,那么它应该是同步的。

  

它所做的无非就是从数据库中获取已加载的数据并填写VM的属性。因此不涉及任何IO操作。

复制属性是完全同步的,因此该方法应该是同步的。