2015-11-30 18 views
-1

我正在尋找使用delegateasyncawait的想法。好不好?我在Google上搜索過,但沒有一個與我的相似。我應該使用委託來聲明一個匿名異步方法嗎?

我定義更改與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; 
    } 
} 

是我的代碼不可思議?我應該使用它嗎?

+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。我忘了在這種情況下不需要在方法中聲明一個方法:) –