如何处理异步方法返回awaitable和nonawaitable



我想做的是,在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清楚地表明没有任何东西被归还。

此外,如果您尝试访问对象中的成员,这对于突出显示有缺陷的代码-试图访问nothing的成员毫无意义。访问空对象的成员不会失败这意味着虫子可能会被发现。

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

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

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

  • 标记的async方法可以使用wait来指定挂起点。等待运算符告诉编译器,在等待的异步进程完成之前,异步方法不能继续超过该点。同时,控制返回到异步方法的调用方。u2028在等待表达式处挂起异步方法并不构成对该方法的退出,最终块不会运行
  • 标记的异步方法本身可以由调用它的方法等待

异步方法通常包含一个或多个等待运算符,但没有等待表达式不会导致编译器错误。如果异步方法不使用等待运算符来标记挂起点,则该方法将像同步方法一样执行,尽管使用了async修饰符。编译器会针对此类方法发出警告。

最新更新