2015-04-06 81 views
0

我有一個是從什麼地方稱爲Web API的功能,但在裏面,我有需要的代表,專門爲完整和錯誤(雖然他們的例子服務。WebAPI函數中的C#匿名函數?

public async Task<HttpResponseMessage> MyApiFuncAsync() 
{ 
     SomeService s = new Service(); 

     HttpResponseMessage responseMessage; 

     EventHandler completeEventHandler = (info) => { 
      responseMessage = Request.CreateResponse(HttpStatusCode.OK); 
     }; 

     EventHandler errorEventHandler = (error) =>{ 
      responseMessage = Request.CreateErrorResponse(HttpStatusCode.BadRequest); 
     }; 


     s.Complete += completeEventHandler; 

     s.Error += errorEventHandler; 

     try 
     { 
      await s.PerformService(); 
     } 
     finally 
     { 
      s.Complete -= completeEventHandler; 
      s.Error -= errorEventHandler; 
     } 

     return responseMessage; 
} 

我沒有做過在此之前,它可能工作不同於如果我的外部函數是在桌面/控制檯應用程序。

據我所知,線await s.PerformService()會坐在那裏,直到這些事件處理程序中的一個被解僱了。所以那時,responseMessage會已經被設置爲正確的響應了,但我想,可能最終會返回null,因爲它可能不是相同的變量因爲我試圖在這些事件處理程序中設置。

我該如何重構這個函數?

回答

0

只要HttpResponseMessage是類而不是結構,您的代碼就是正確的。 Lambdas將按值引用和值類型捕獲引用類型。一旦通過引用捕獲,它將寫入到你正在返回的完全相同的變量。

需要注意的一點是,如果你在for循環中執行此操作,並通過引用捕獲循環變量,那麼如果lambda在循環結束後執行(通常是這種情況),它將讀取循環變量的最終值。

如果您想查找更多信息,lambda及其捕獲的變量將被稱爲閉包;