WebAPI函数中的C#匿名函数?
问题描述:
我有一个是从什么地方称为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,因为它可能不是相同的变量因为我试图在这些事件处理程序中设置。
我该如何重构这个函数?
答
只要HttpResponseMessage是类而不是结构,您的代码就是正确的。 Lambdas将按值引用和值类型捕获引用类型。一旦通过引用捕获,它将写入到你正在返回的完全相同的变量。
需要注意的一点是,如果你在for循环中执行此操作,并通过引用捕获循环变量,那么如果lambda在循环结束后执行(通常是这种情况),它将读取循环变量的最终值。
如果您想查找更多信息,lambda及其捕获的变量将被称为闭包;