C# 不确定在异步方法中在何处使用等待运算符

C# 不确定在异步方法中在何处使用等待运算符,c#,asp.net,async-await,C#,Asp.net,Async Await,在阅读了大量有关async/await的内容后,我仍然不确定在我的async方法中在哪里使用await运算符: public async Task<IActionResult> DailySchedule(int professionalId, DateTime date) { var professional = professionalServices.Find(professionalId); var ap

在阅读了大量有关async/await的内容后,我仍然不确定在我的async方法中在哪里使用await运算符:

    public async Task<IActionResult> DailySchedule(int professionalId, DateTime date)
    {
        var professional = professionalServices.Find(professionalId);            
        var appointments = scheduleService.SearchForAppointments(date, professional);
        appointments = scheduleService.SomeCalculation(appointments);

        return PartialView(appointments);
    }
或者我应该只将async设置为第一个

        var professional = await professionalServices.FindAsync(professionalId);            
        var appointments = scheduleService.SearchForAppointments(date, professional);
        appointments = scheduleService.SomeCalculation(appointments);

区别是什么?

每个
async
方法调用都需要
wait
ed,这样每个方法调用都会释放线程,从而不会导致阻塞。因此,在您的情况下,您应该这样做:

var professional = await professionalServices.FindAsync(professionalId);            
var appointments = await scheduleService.SearchForAppointmentsasync(date, professional);
appointments = await scheduleService.SomeCalculationAsync(appointments);

每个
async
方法调用都需要
wait
ed,这样每个方法调用都会释放线程,从而不会导致阻塞。因此,在您的情况下,您应该这样做:

var professional = await professionalServices.FindAsync(professionalId);            
var appointments = await scheduleService.SearchForAppointmentsasync(date, professional);
appointments = await scheduleService.SomeCalculationAsync(appointments);

正如VSG24所说,您应该等待每一个可以等待的调用,这是因为这将帮助您使主线程免于任何长时间运行的任务,例如,从internet下载数据的任务,使用I/O将数据保存到磁盘的任务等。问题是,每当您必须执行长时间运行的任务时,它总是冻结用户界面。为了克服这个问题,我们使用了异步模式,因此这个async/await允许您创建一个函数,在后台执行长时间运行的任务,并且您的主线程一直与用户通信

我仍然不确定在我的异步方法中在哪里使用wait操作符

直觉是每个以
Async
结尾的函数都可以等待(前提是它们的签名也匹配,如下所示),并且它们返回
任务或
任务。然后可以使用返回void的函数等待它们-您不能等待
void
。因此,对于响应时间稍长的函数,您应该在那里应用wait。我个人的观点是,一个可能需要超过1秒的函数应该等待-因为在你的设备上这是1秒,也许你的客户端需要等待5秒,或者更糟的是10秒。他们只是要关闭应用程序,然后走开说,它不工作


好的,如果其中一个非常快,它不需要是异步的,对吗

以什么方式快速?不要忘记,您的客户可能没有非常快的机器,他们肯定会受到冻结应用程序的影响。因此,请帮他们一个忙,并始终等待功能

有什么区别

区别在于,在最后一个代码示例中,只等待第一个调用,其他调用将同步执行。VisualStudio还将通过在代码下方提供绿色的曲线向您解释这一部分,您可以通过将鼠标悬停在代码上方看到这些曲线。这就是为什么,您应该尽可能地等待每一个异步调用


提示:如果需要函数中的过程,例如在启动应用程序之前加载所有数据,则应避免异步/等待模式,而是使用同步方法下载数据并执行其他任务。因此,这完全取决于您正在做什么,而不是文档中所说的内容。:-)

正如VSG24所说,您应该等待每一个可以等待的调用,因为这将帮助您使主线程免于任何长时间运行的任务,例如,从internet下载数据的任务,使用I/O等将数据保存到磁盘的任务。问题是,每当您必须执行长时间运行的任务时,它总是冻结UI。为了克服这个问题,我们使用了异步模式,因此这个async/await允许您创建一个函数,在后台执行长时间运行的任务,并且您的主线程一直与用户通信

我仍然不确定在我的异步方法中在哪里使用wait操作符

直觉是每个以
Async
结尾的函数都可以等待(前提是它们的签名也匹配,如下所示),并且它们返回
任务或
任务。然后可以使用返回void的函数等待它们-您不能等待
void
。因此,对于响应时间稍长的函数,您应该在那里应用wait。我个人的观点是,一个可能需要超过1秒的函数应该等待-因为在你的设备上这是1秒,也许你的客户端需要等待5秒,或者更糟的是10秒。他们只是要关闭应用程序,然后走开说,它不工作


好的,如果其中一个非常快,它不需要是异步的,对吗

以什么方式快速?不要忘记,您的客户可能没有非常快的机器,他们肯定会受到冻结应用程序的影响。因此,请帮他们一个忙,并始终等待功能

有什么区别

区别在于,在最后一个代码示例中,只等待第一个调用,其他调用将同步执行。VisualStudio还将通过在代码下方提供绿色的曲线向您解释这一部分,您可以通过将鼠标悬停在代码上方看到这些曲线。这就是为什么,您应该尽可能地等待每一个异步调用

提示:如果需要函数中的过程,例如在启动应用程序之前加载所有数据,则应避免异步/等待模式,而是使用同步方法下载数据并执行其他任务。因此,这完全取决于您正在做什么,而不是文档中所说的内容。:-)

我仍然不确定在我的异步方法中在哪里使用wait操作符

你从错误的角度来处理这个问题

转换为
async
时,首先要更改的是最低级别的API调用。有些操作天生是异步的,特别是I/O操作。其他操作自然是同步的,例如CPU代码

根据名称“Find”、“searchforappoints”和“SomeCalculation”,我怀疑
Find
searchforappoints
是I/O-b