为什么 ASP.NET Core 中的线程 ID 会发生变化?

2023-12-27

我使用 Thread 来存储区域设置并将其传递到各层。

在我的中间件中,我在当前线程中设置选定的区域设置,如下所示:

Thread.SetData(Thread.GetNamedDataSlot('SelectedLocale'), selectedLocale /* I get this value form the request */);

然后在代码的其余部分中,我使用这一行来访问该数据:

var selectedLocale = Thread.GetData(Thread.GetNamedDataSlot('SelectedLocale'));

然而,这有时有效,有时返回 null。

I used var threadId = Thread.CurrentThread.ManagedThreadId并意识到Id有时会改变。

为什么会这样呢?如何确保在请求处理期间使用相同的线程?

Update

我对 API 和 Razor Page 应用程序使用相同的技术。

我的 API 工作得很好。他们永远不会失败。

然而,我的 Razor Page 应用程序几乎 70% 的时间都会失败。但它们有时也会起作用。

我想这里肯定有一些与 Razor Pages 有关的东西。


我使用 Thread 来存储区域设置并将其传递到各层。

我没有在代码中使用 async/await

如果您仍在考虑线程而不使用 async/await,那么您就错了。线程是一种太低级的构造,无法在应用程序代码(尤其是 Web 应用程序代码)中使用。

现在都是任务和上下文。如果你使用 Razor 页面,那么will由框架异步处理。只需使用 HttpContext 将实体从一个中间件传递到下一个中​​间件即可。

尽管 HttpContext 有其自身的问题。

更多阅读:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-6.0 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-6.0, https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-6.0 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-6.0.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 ASP.NET Core 中的线程 ID 会发生变化? 的相关文章

随机推荐