akh*_*oer 3 c# asynchronous async-await c#-5.0 asp.net-web-api
我就是这个场景,想要在走这条路之前检查是否可行.
我有一个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
}
Run Code Online (Sandbox Code Playgroud)
在DLL中,类DBCalls
async void Method1Async()
{
await internalMethod1().configureawait(false)
}
async void Method2Async()
{
await internalMethod2().configureawait(false)
}
Run Code Online (Sandbox Code Playgroud)
问题是当执行恢复到控制器功能时,我将从HttpContext.Current.Items获取存储的数据吗?
当执行恢复到控制器功能时,我会从中获取存储的数据
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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,我已经改变了MethodNAsync,从async void到async Task.async void除非必须使用方法,否则你不应该使用它们,而你肯定无法使用await它们.
而且,我假设真正的MethodNAsync实际做某事.如果他们只是委托给内部方法,你可以简化它们(使用C#6.0表达式方法使它们更短):
Task Method1Async() => InternalMethod1();
Task Method2Async() => InternalMethod2();
Run Code Online (Sandbox Code Playgroud)