如何从异步函数返回错误,返回Task <T>

Iga*_* S. 3 c# async-await

我在一个类中有一个基本的异步方法,该方法返回一个对象。

在某些流程中,它可能会失败,我想向您报告。

但是我只能返回对象。

我尝试了可为空的对象,但收到错误消息:

MyObject必须是非空值类型,才能在通用类型或方法“ System.Nullable”中将其用作参数“ T”

我假设我可以使用异常,但是我想在调用函数中使用一些更简单的方法。

我也不能在异步方法中使用refout

有没有一种方法可以报告成功或失败的正确/错误?

public static async Task<MyObject> getObject()
{
    if (NotOkFromSomeReason())
    {
          //Not sure what to do here
    }
    return await myDataBase.FindAsync(something);
}
Run Code Online (Sandbox Code Playgroud)

我称它为:

  MyObject object = await getObject();
  // I want something simple as if(object)...
Run Code Online (Sandbox Code Playgroud)

Ond*_*dar 7

只需将其包装到另一个类中,该类将返回所需的实例和状态代码 - 例如:

public class StatusReport
{
    public boolean Ok { get; set; }
    public MyObject Instance { get; set; }
}

public static async Task<StatusReport> getObject()
{
  if (NotOkForSomeReason())
  {
    return new StatusReport { Ok = false };
  }
  return new StatusReport { Ok = true, Instance = await myDataBase.FindAsync(something) };
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个解决方案。但我一直在寻找更简单的东西。 (2认同)

Jcl*_*Jcl 7

如果null可以选择返回,则可以执行以下操作:

public static Task<MyObject> getObject()
{
  if (NotOkFromSomeReason())
  {
    return Task.FromResult<MyObject>(null);
  }
  return myDataBase.FindAsync(something);
}
Run Code Online (Sandbox Code Playgroud)

PS:我想await此功能中没有其他代码可使用,因此已删除了async。否则,您可以只使用async限定符并null直接返回。由于它是返回Task对象,因此仍然可以从外面等待

然后,您可以检查null外面:

MyObject myObject = await getObject();
if(myObject == null)
{
}
Run Code Online (Sandbox Code Playgroud)

仅当null不可能的“正确”结果时,这才起作用

否则您可以使用例外