2015-11-30 2 views
-1

Я ищу идеи об использовании delegate с async и await. Хорошо это или нет? Я искал в Google, но ни один из них не похож на мой.Должен ли я использовать делегат для объявления анонимного асинхронного метода?

я определяю способ, чтобы изменить статус сообщения (isRead = true) с SignalR:

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

мой код странно? Должен ли я использовать его?

+0

Почему вы используете делегат там, когда вы только вызываете делегата один раз? Вы решаете проблему с этим или просто хвастаетесь? :-) –

+0

@GaryMcGill Вы имеете в виду, что я должен использовать 'делегат', если я назову его дважды или более раз в классе, не так ли? –

+1

Ну, я имею в виду, что делегаты могут быть полезны в некоторых обстоятельствах, но вы, похоже, ищете причину их использования, вместо того, чтобы искать решение проблемы (какое решение может быть делегатом или чем-то еще). В чем проблема, которую вы пытаетесь решить? Я отправлю ответ, как бы я структурировал этот код. –

ответ

0

Зачем использовать делегат? Что случилось с:

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

Вы могли бы хотеть, чтобы сломать эту верхнюю часть из в частный метод, но я не уверен, почему вы хотите, чтобы сделать его делегатом ...

+0

ya. Я забыл, что нет необходимости объявлять метод внутри метода в этом случае :) –

Смежные вопросы