在异步ASP.NET Web API中的ThreadStatic

5
有没有可能在单个请求中使用线程静态变量?当前代码使用线程静态变量进行日志记录,现在我们想要使用异步控制器方法(使用异步和等待模式),但由于在新线程打开时该变量为空,所以会出现问题。
1个回答

14

await 可能会引起线程跳转,因此线程静态变量通常会导致问题。

要解决此问题,您可以使用 AsyncLocal<T> (在 .NET 4.6 中可用), 或者(如果必须的话)使用 HttpContext.Current.Items。其中两个选项,如果您的平台支持,我一定会推荐使用 AsyncLocal<T> 而不是 Items


我可以问一下你为什么推荐使用AsyncLocal而不是Items吗? - vinhent
2
我建议使用AsyncLocal<T>而不是HttpContext.Current,因为HttpContext.Current被认为是一种糟糕的设计,并已在ASP.NET Core中被移除。 - Stephen Cleary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接