切换一个 Task<T> 其中 T 是一个枚举

Switch a Task<T> where T is an enum

我想得到一个 Task<T>,它由 属性 返回。

enum ProgressStatus
{
   Success = 0,
   Failure
}

interface IMessage
{
   Task<ProgressStatus> AddMessage();
}

class Message : IMessage
{
   public Task<ProgressStatus> Add
   {
      get
      {
         return AddMessage();
      }
      set
      {
         Add = value;
      }
   }

   public async Task<ProgressStatus> AddMessage()
   {
      using (var db = new VinaChanelDbContext())
      {
         try
         {
            //do stuff...

            await db.SaveChangesAsync();
            return ProgressStatus.Success;
         }
         catch { return ProgressStatus.Failure; }
       }
   }
}

我的问题是:如何switch 属性 new Message().Add?

var msg = new Message();
switch (msg.Add) //this must be an enum instead of Task<enum>
{
   case ProgressStatus.Success:
      return Json(new { success = true });
   case ProgressStatuc.Failure:
   default:
      return Json(new { success = false });
}

为什么一定要 Task<T>?因为我想在方法 AddMessage.

中使用 asyncawait

可能吗?

Why must it be Task<T>?

要跟随链条,Add 必须是 Task<ProgressStatus> 因为它 returns AddMessage();,也就是 Task<ProgressStatus>.

How to switch property new Message().Add?

回答就像"don't"一样简单。相反,await Task<ProgressStatus> 并使用结果。任务不一定 运行 尚未:await 表示当前代码将等待任务完成。

ProgressStatus statusAfterAdding = await msg.Add;
switch (statusAfterAdding)
{
    // ...
}

您已经将 awaitawait db.SaveChangesAsync(); 一起使用,这是一回事:SaveChangesAsync returns 一个 Task<int>,您 await (尽管您忽略了返回的 int)。