我在 web api 2 项目中使用 MessageHandler 类(继承自 DelegatingHandler)
这是使用方法:
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
在此 im 中使用以下代码段:
string stringVariable = HelperClass.SomeFunctionThatReturnsAStringValue();
在代码的下方,我会像这样调用
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
最后在接近尾声时,我执行以下操作:
if (!String.IsNullOrWhiteSpace(stringVariable))
response.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue(Bearer, stringVariable));
我在 web.config 中设置了以下内容,这也是阅读其他 SO 帖子时推荐的。
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
<system.web>
<httpRuntime targetFramework="4.5" />
...
</system.web>
我的问题是关于 stringVariable。
当多个请求同时进入@时,该值是否有可能在代码片段中以不同的方式设置@最后将其发回以作为响应?
(我的理解是处理线程在调用 await 时被释放,因此线程安全可能是一个问题)
即:对于 UserA,变量被设置,但是当 UserB 在@同时发出请求时,由于等待逻辑,为 UserA 设置的值将应用于 UserB
最佳答案
编译器为 async
方法创建一个状态机,它为执行该方法的每个线程单独初始化。所以每个请求线程都会有自己的状态机,并且在 await
语句执行之前线程本身不会被释放。
每个请求也将有自己的 stringVaraible
,因为它是一个不受其他线程影响的局部变量。
关于c# - 在 C# 中使用变量等待和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36859547/