异步ASP.NET Web API中的ThreadStatic

Nic*_*ico 4 asp.net threadstatic async-await asp.net-web-api requestscope

是否有可能在单个请求中使用线程静态变量?当前代码使用线程静态变量进行日志记录,现在我们希望使用异步控制器方法(使用async和await模式),这会导致问题,因为在打开新线程时该变量为null.

Ste*_*ary 10

await 可能导致线程跳转,因此线程静态变量自然会导致问题.

要解决此问题,您可以使用AsyncLocal<T>(在.NET 4.6中可用)或(如果必须)HttpContext.Current.Items.这两个的,我肯定会推荐AsyncLocal<T>Items,如果这是您的平台上.

  • 我推荐使用“AsyncLocal&lt;T&gt;”而不是“HttpContext.Current”,因为“HttpContext.Current”被认为是一个糟糕的设计,并且已在 ASP.NET Core 中删除。 (2认同)