在这种情况下,我想在走这条路之前检查是否可行。
我是一个webApi项目,有一个delegateHandler,它在HttpContext.Current.Items中添加了一些数据。在控制器中,我使用configureawait(false)进行的异步调用很少。库DLL中也一样。
整体代码看起来像这样......
在控制器中
public async Task<Entity> func()
{
HttpContext.Current.Items.Add(key, value);
await DBCalls.Method1Async().configureawait(false);
await DBCalls.Method2Async().configureawait(false);
var data = HttpContext.Current.Items[key];
// rest of the method
}
在DLL中,类DBCalls
async void Method1Async()
{
await internalMethod1().configureawait(false)
}
async void Method2Async()
{
await internalMethod2().configureawait(false)
}
问题是当执行恢复到控制器功能时,我会从HttpContext.Current.Items中获取存储的数据吗?
答案 0 :(得分:5)
不,你不会。当执行恢复到控制器功能时,我将从
返回存储的数据HttpContext.Current.Items
?
ConfigureAwait(false)
完全适用于不需要在之前的上下文中恢复的情况。但要访问HttpContext.Current
,您需要这样做。
您应该做的是在“库”代码中使用ConfigureAwait(false)
(例如InternalMethodN
和可能Method1Async
),这不依赖于上下文。但是在需要返回ASP.NET请求上下文的“应用程序”代码中,请不要使用ConfigureAwait()
。
因此,您的代码应如下所示:
public async Task<Entity> Func()
{
HttpContext.Current.Items.Add(key, value);
await DBCalls.Method1Async();
await DBCalls.Method2Async();
var data = HttpContext.Current.Items[key];
// rest of the method
}
async Task Method1Async()
{
await InternalMethod1().ConfigureAwait(false);
}
async Task Method2Async()
{
await InternalMethod2().ConfigureAwait(false);
}
请注意,我已将MethodNAsync
从async void
更改为async Task
。您不应该使用async void
方法,除非必须使用await
,否则您肯定无法使用MethodNAsync
。
另外,我假设真正的Task Method1Async() => InternalMethod1();
Task Method2Async() => InternalMethod2();
实际做了些什么。如果他们只是委托内部方法,你可以简化它们(使用C#6.0表达式方法使它们更短):
app.dit