为什么ASP.NET Core中的线程Id会更改



我正在使用Thread来存储Locale并将其向下传递到层。

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

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

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

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

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

我使用了var threadId = Thread.CurrentThread.ManagedThreadId,并意识到Id有时会发生变化。

为什么会这样?如何确保在处理请求时使用同一个线程?

更新

我在我的API和RazorPage应用程序中使用了相同的技术。

我的API工作得很好。他们从不失败。

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

我想这里一定有与剃刀页有关的东西。

我正在使用Thread来存储Locale并将其向下传递到层。

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

如果你仍然在线程中思考,而没有使用async/await,那么你做得不对。线程是一个太低级的构造,不能用于应用程序代码,尤其是web应用程序代码。

现在都是任务和上下文。如果使用Razor页面,框架将异步处理的内容。只需使用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/http-context?view=aspnetcore-6.0.

最新更新