繁体   English   中英

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

[英]how to handle async method return both awaitable and non-awaitable

我想做的是在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();
}

我发现这个答案对我非常有用,我只是在这里发布以供参考。

编辑:我的原始答案没有解决帖子的真正问题。

还有另一篇与此相关的关于返回null与空对象的帖子: 函数应该返回 null 还是空对象?

如果您打算表明没有可用数据,则返回 null 通常是最好的主意。

空对象表示已返回数据,而返回 null 明确表示未返回任何内容。

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

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

微软也有一些关于异步编程的很棒的文档。 我会在这里看看这篇文章: https : //docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/task-asynchronous-programming-model ,特别是这部分:

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

  • 标记的 async 方法可以使用 await 来指定暂停点。 await 运算符告诉编译器在等待的异步过程完成之前,异步方法不能继续超过该点。 同时,控制权返回给异步方法的调用者。 在 await 表达式中暂停异步方法并不构成该方法的退出,并且 finally 块不会运行。
  • 标记的异步方法本身可以由调用它的方法等待。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM