Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该使用委托声明匿名异步方法吗?_C#_Asynchronous_Delegates - Fatal编程技术网

C# 我应该使用委托声明匿名异步方法吗?

C# 我应该使用委托声明匿名异步方法吗?,c#,asynchronous,delegates,C#,Asynchronous,Delegates,我正在寻找有关将委托与异步和等待一起使用的想法。是好是坏?我在谷歌上搜索过,但没有一个和我的相似 我正在定义一种方法来使用SignalR更改消息状态(isRead=true): enum MessageStatus { Failure, Success } delegate Task<MessageStatus> MsgDelegate(string id); public async Task ChangeMessageStatus(string id) { st

我正在寻找有关将
委托
异步
等待
一起使用的想法。是好是坏?我在谷歌上搜索过,但没有一个和我的相似

我正在定义一种方法来使用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
{
失败,
成功
}
委托任务MsgDelegate(字符串id);
公共异步任务ChangeMessageStatus(字符串id)
{
字符串错误=string.Empty;
MsgDelegate msg=async(x)=>
{
尝试
{
使用(var db=new VinaChanelDbContext())
{
var message=db.Messages.SingleOrDefault(m=>m.Id==x);
如果(消息!=null)
{
message.IsRead=true;
}
return wait db.saveChangesSync()>0?
MessageStatus.Success:MessageStatus.Failure;
}
}
捕获(例外e)
{
错误=e.消息;
返回消息状态。失败;
}
};
开关(等待消息(id))
{
案例消息状态。成功:
Clients.Caller.updateStatus(true);
打破
案例消息状态。失败:
Clients.Caller.errorMessage(错误);
Clients.Caller.updateStatus(false);
打破
}
}

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

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

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

您可能希望将顶部部分拆分为一个私有方法,但我不确定您为什么要将其设置为委托…

当您只调用一次委托时,为什么要在那里使用委托?你是在用它解决问题,还是只是在炫耀?:-)@GaryMcGill你的意思是,如果我在一堂课上叫它两次或更多次,我应该使用
委托,不是吗?我的意思是,委托在某些情况下可能有用,但你似乎在寻找使用委托的理由,而不是寻找问题的解决方案(哪个解决方案可能是委托或其他)。你想解决的问题是什么?我将发布一个答案,告诉你我将如何构建这个代码。我忘记了在这种情况下不需要在方法中声明方法:)