c# - 在 C# 中使用变量等待和线程安全

标签 c# multithreading thread-safety async-await asp.net-web-api2

我在 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/

相关文章:

iphone - Objective-C 相当于 Java 的 BlockingQueue?

ios - NSCondition,如果调用信号时没有锁定怎么办?

java - 线程安全与同步

c# - 可以将 C# 获取、设置代码转换为 C++

c# - 如何比较字符串和 bool 数组?

c# - 使用 ThreadPool.QueueUserWorkItem 的线程排序

c++ - 将互斥量与 shared_ptr 结合使用以保护跨拷贝共享的数据

java - JAVA方法中的线程互斥

c# - 最佳拟合算法以在回合中均匀放置对决

c# - AvalonEdit 高亮匹配字符