3

林在Web API(从DelegatingHandler继承)2项目等待和线程安全使用的MessageHandler类变量工作

这是使用方法:使用

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 

在该即时通讯下面的代码片段:

string stringVariable = HelperClass.SomeFunctionThatReturnsAStringValue(); 

再往下我的代码,然后让像这样

通话

最后接近尾声我然后执行以下操作:

if (!String.IsNullOrWhiteSpace(stringVariable)) 
       response.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue(Bearer, stringVariable)); 

我已经设置了下面这也是从阅读其他职位SO建议web.config中。

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
<system.web> 
    <httpRuntime targetFramework="4.5" /> 
    ... 
</system.web> 

我的问题是围绕着stringVariable。
是否有可能在代码片段中将该值设置为不同的结尾@当多个请求在同一时间进入时,将其作为响应发回。

(我的理解是,当AWAIT被调用,所以线程安全可能是一个问题的处理线程得到释放)

即:对用户A的变量被设置,但是当用户B使得请求@同时为用户A设置的值由于等待逻辑而被应用于UserB

+2

直到'await'语句执行时,线程才会被释放,并且每个请求都有自己的'stringVaraible',因为这是一个局部变量。这有帮助吗? –

+0

感谢Ned,是的,这就是我对await(线程获得释放)的理解,所以你说的是stringVariable在上面的上下文中是安全的,并且将始终正确地设置它用于的线程? (不适用于不同用户的另一个线程) – AdrianSean

+0

是的,这是正确的 –

回答

1

编译器为async方法创建一个状态机,该方法为执行该方法的每个线程分别进行初始化。所以每个请求线程都有它自己的状态机,线程本身不会被释放,直到执行await语句。

每个请求也会有自己的stringVaraible,因为这是一个本地变量,它不受其他线程影响。

+0

酷酷..所以状态机将存储任何局部变量在该含义内下一次线程被调用(它被释放后)一切都完好无损 – AdrianSean