【问题标题】:C# Anonymous Functions Inside WebAPI Function?WebAPI函数中的C#匿名函数?
【发布时间】:2015-04-06 17:45:06
【问题描述】:

我有一个从某个地方调用的 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,因为它可能与我试图在这些事件处理程序中设置的变量不同。

我应该如何重构这个函数?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多