如何处理异步方法返回等待和不等待

时间:2020-09-09 00:32:05

标签: c# asp.net .net asp.net-core async-await

我想做的是在某个情况下,async方法中我什么都不想要,而在await方法中我不想执行public async Task<JObject> Process() { //if the _id is null I just do not want to do anything //I do not want to throw an exception either as it's ok to not to do anything. // I am not sure what is the recommended way to do this so I am just returning `new JObject()` // so It compiles. if(_id == null ) return new JObject(); return await DoTheWork(); } 代码。 (我也不想抛出异常,因为可以不做任何事情。)我应该怎么做?还是这样做更好?

所以我有以下代码:

select 
    department, 
    min_salary, 
    (select s1.last_name from staff s1 where s1.salary=s3.min_salary ) lastname 
from 
    (select department, min (salary) min_salary from staff s2 group by s2.department) s3

我发现这个answer对我来说非常有用,我只是在此处发布以供参考。

1 个答案:

答案 0 :(得分:1)

编辑:我的原始答案未解决帖子的真实问题。

与此相关的另一篇文章是关于返回null和一个空对象:Should functions return null or an empty object?

如果您打算指出空值,通常最好返回null 没有可用数据。

一个空对象表示已返回数据,而返回null 清楚表明什么都没有退回。

此外,如果您返回null,则会导致null异常 尝试访问对象中的成员,这可能对 突出显示错误的代码-尝试不访问任何成员 没有意义。访问空对象的成员不会失败 意味着错误可能不会被发现。

但是,如果_id永远不能成为null,那么抛出异常可能是更好的解决方案,因为它可以帮助您优雅地处理逻辑中的错误,并允许您添加日志记录。

Microsoft通常还提供一些有关异步编程的出色文档。我会在这里看一下这篇文章:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/task-asynchronous-programming-model,尤其是这一部分:

如果使用async修饰符指定方法为异步方法,则启用以下两项功能。

  • 标记的异步方法可以使用await来指定挂起点。等待操作符告诉编译器,直到等待的异步过程完成,异步方法才能继续到该点为止。同时,控制权返回给异步方法的调用者。 在await表达式中暂停异步方法并不构成对该方法的退出,并且最终块也不会运行。
  • 标记的异步方法本身可以由调用它的方法来等待。

一个异步方法通常包含一个或多个出现的await运算符,但是缺少await表达式不会导致编译器错误。如果异步方法未使用await运算符标记暂停点,则尽管使用了async修饰符,该方法仍将与同步方法一样执行。编译器会针对此类方法发出警告。