2015-04-06 95 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及其捕获的变量将被称为闭包;