Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非IO方法(例如,在创建视图模型时)应该是异步的吗?_C#_Asp.net Mvc_Asynchronous - Fatal编程技术网

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

C# 非IO方法(例如,在创建视图模型时)应该是异步的吗?,c#,asp.net-mvc,asynchronous,C#,Asp.net Mvc,Asynchronous,我学习了一点异步等待模式,我想我在某种程度上理解了它。我知道它们是用来避免阻塞UI的,主要用于IO操作,如DB或文件访问。 我现在正试图将两个MVC操作方法重构为异步的。虽然DB访问非常有意义(例如EF的ToListSync()),但我在视图模型生成以及如何(或是否)异步方面遇到了问题 考虑到我有这样一种方法(我相信MVC中的标准方法): 我可以将其更改为: public async Task<PartialViewResult> DoSomethingAsync() {

我学习了一点异步等待模式,我想我在某种程度上理解了它。我知道它们是用来避免阻塞UI的,主要用于IO操作,如DB或文件访问。 我现在正试图将两个MVC操作方法重构为异步的。虽然DB访问非常有意义(例如EF的ToListSync()),但我在视图模型生成以及如何(或是否)异步方面遇到了问题

考虑到我有这样一种方法(我相信MVC中的标准方法):

我可以将其更改为:

public async Task<PartialViewResult> DoSomethingAsync()
    {
        var dataFromDb = await _dataService.GetSomeDataAsync();
        var viewModel = Data2DataViewModel(dataFromDb);
        return PartialView("_SomePartialView", viewModel);
    }
一般来说,它只是从数据库中获取加载的数据并填充VM的属性。因此不涉及IO操作。 根据我的理解,只有IO操作应该是异步的,因为它们才是真正可能阻塞UI的操作。 但是我的应用程序中90%的DB操作所需的时间不到0,5秒,因此我开始怀疑将方法异步化是否真的会给我带来任何提升,以及我的理解和思考是否真的有意义。 感谢所有答案

用于避免阻塞用户界面

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

我的方法Data2DataViewModel是否也应该通过异步

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

它只是从数据库中获取加载的数据并填充VM的属性。因此不涉及IO操作


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

Data2DataViewModel
是一个类,您可以通过执行
新建Data2DataViewModel
来使用它。因此,您通过调用该类的构造函数来创建该类的对象。构造函数不能是异步的。只有方法可以是异步的。我认为没有硬性规定。如果一个方法不等待任何东西,就没有特定的理由使它异步,如果这样做,确实会收到编译器警告。但另一方面,如果您计划在将来某个时候向它添加一些异步调用,或者如果您试图与其他方法保持一致(例如,您正在实现一个返回任务的接口方法),那么除了一点点开销之外,它没有什么真正的危害。谢谢您的评论。因此,我是否正确理解:只要我不等待IO操作(DB、文件…),即使一个方法可能需要一些时间(例如复杂的计算),async也不会帮助我?如果处理器忙于某个不执行IO的方法上的某些工作,async不会改变它是否阻塞UI,对吗?将
async
添加到一个方法不会神奇地使它以任何方式在后台运行,实际上,您必须启动某种形式的任务,并使用
wait
,以获得与普通方法调用不同的任何内容。这正是我想要的答案,谢谢!
public async Task<PartialViewResult> DoSomethingAsync()
    {
        var dataFromDb = await _dataService.GetSomeDataAsync();
        var viewModel = Data2DataViewModel(dataFromDb);
        return PartialView("_SomePartialView", viewModel);
    }
public ViewModel Data2DataViewModel(DataFromDB dataFromDb)
{    
DataViewModel result = new DataViewModel()
    {
        Prop1 = dataFromDb.Prop,
        Prop2 = dataFromDb.SomeOtherProp
    };

    return result;
}