WebAPI函数中的C#匿名函数?

时间:2015-04-06 17:45:06

标签: c# function events asp.net-web-api delegates

我有一个从某个地方调用的Web API函数,但在其中,我有一个需要委托的服务,特别是完整和错误(虽然它们是示例。

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,因为它可能与我尝试在这些事件处理程序中设置的变量不同。

我该如何重组这个功能?

1 个答案:

答案 0 :(得分:0)

如果HttpResponseMessage是一个类而不是结构,那么您的代码是正确的。 Lambdas将按引用和值类型按值捕获引用类型。一旦通过引用捕获,它将写入您要返回的完全相同的变量。

需要注意的一点是,如果你在for循环中执行此操作并通过引用捕获循环变量,那么如果lambda在循环结束后执行(通常就是这种情况),它将读取循环变量的最终值。

如果您想查找更多信息,则将lambda及其捕获的变量称为闭包;