如何从异步函数返回错误返回任务<t>

时间:2016-03-14 11:00:10

标签: c# async-await

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

在某些流程中,它可能会失败,我想将其报告回来。

但我只能归还对象。

我尝试了可以​​为空的对象,但得到了错误:

  

MyObject必须是不可为空的值类型才能将其用作参数&#39; T&#39;在通用类型或方法中,System.Nullable&#39;

我假设我可以使用异常,但我想在调用函数中使用更简单的东西。

我也无法在异步方法中使用refout

有没有办法报告成功或失败的某种真假?

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

我用它来打电话:

  MyObject object = await getObject();
  // I want something simple as if(object)...

2 个答案:

答案 0 :(得分:5)

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

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

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

然后你可以检查外面的null

MyObject myObject = await getObject();
if(myObject == null)
{
}

这仅在null不可能&#34;正确&#34;结果

否则您可以使用例外

答案 1 :(得分:0)

将它包装到另一个将返回所需实例的类中。状态代码 - 如:

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) };
}