我应该使用委托来声明一个匿名异步方法吗

本文关键字:一个 异步方法 声明 我应该 | 更新日期: 2023-09-27 18:25:01

我正在寻找有关将delegateasyncawait一起使用的想法。它好还是不好?我在谷歌上搜索过,但没有一个和我的相似。

我正在定义一种用SignalR:更改消息状态(isRead = true)的方法

enum MessageStatus
{
  Failure,
  Success
}
delegate Task<MessageStatus> MsgDelegate(string id);
public async Task ChangeMessageStatus(string id)
{
   string error = string.Empty;
   MsgDelegate msg = async (x) =>
   {
      try
      {
         using (var db = new VinaChanelDbContext())
         {
            var message = db.Messages.SingleOrDefault(m => m.Id == x);
            if (message != null)
            {
               message.IsRead = true;
            }
            return await db.SaveChangesAsync() > 0 ? 
                MessageStatus.Success : MessageStatus.Failure;
         }
      }
      catch (Exception e)
      {
         error = e.Message;
         return MessageStatus.Failure;
      }
   };
   switch (await msg(id))
   {
      case MessageStatus.Success:
         Clients.Caller.updateStatus(true);
         break;
      case MessageStatus.Failure:
         Clients.Caller.errorMessage(error);
         Clients.Caller.updateStatus(false);
      break;
   }
}

我的代码奇怪吗?我应该用它吗?

我应该使用委托来声明一个匿名异步方法吗

为什么要使用委托?有什么问题

enum MessageStatus
{
    Failure,
    Success
}
public async Task ChangeMessageStatus(string id)
{
    string error = string.Empty;
    var status = MessageStatus.Failure;
    try
    {
        using (var db = new VinaChanelDbContext())
        {
            var message = db.Messages.SingleOrDefault(m => m.Id == id);
            if (message != null)
            {
               message.IsRead = true;
               if (await db.SaveChangesAsync() > 0)
               {
                 status = MessageStatus.Success;
               }
            }
        }
    }
    catch (Exception e)
    {
        error = e.Message;
    }
    switch (status)
    {
        case MessageStatus.Success:
            Clients.Caller.updateStatus(true);
            break;
        case MessageStatus.Failure:
            Clients.Caller.errorMessage(error);
            Clients.Caller.updateStatus(false);
            break;
    }
}

你可能想把最上面的部分分解成一个私有方法,但我不确定你为什么要让它成为一个委托。。。