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