Asp.net Identity 任务扩展 WithCurrentCulture() 的作用是什么?为什么?

What does the Asp.net Identity task extension WithCurrentCulture() do and why?

我正在尝试了解 Asp.net 身份系统的内部工作原理,并且发现所有 async 调用似乎都使用了 WithCurrentCulture() 任务扩展。我查看了该扩展的源代码,但我无法弄清楚它在做什么或为什么。

来自文档

Configures an awaiter used to await this Task to avoid marshalling the continuation back to the original context, but preserve the current culture and UI culture.

有人可以解释一下吗?

我的理解是它将请求的文化信息从当前线程传递到可等待线程。否则,等待对象的线程将 运行 在任何默认文化中,在处理日期、语言等时造成很大的麻烦

它执行任务延续,Thread.CurrentCultureThread.CurrentUICulture 设置为与调用它的线程上相同的值。

默认情况下,新线程的文化设置为 Windows 系统文化。例如,假设您正在等待一项任务,并且您已明确将 Thread.CurrentCulture 设置为不同的文化。现在,当您使用 ConfigureAwait(false) 等待任务时,await 之后的代码可能与 await 之前的代码在不同的线程上执行。由于是不同线程,可能CurrentCulture设置回系统文化。

Thread.CurrentThread.CurrentCulture = someCulture;
await SomeTask().ConfigureAwait(false);

bool equal = Thread.CurrentThread.CurrentCulture == someCulture; // Might be false!

如果您想在 await 之后保持文化不变,请使用 WithCurrentCulture()。它的作用与 ConfigureAwait(false) 相同,但也保留了原始线程的文化。

Thread.CurrentThread.CurrentCulture = someCulture;
await SomeTask().WithCurrentCulture();

bool equal = Thread.CurrentThread.CurrentCulture == someCulture; // Will be true

请注意,如果您省略 ConfigureAwait(false)WithCurrentCulture()await 之后的代码将 运行 在与之前相同的线程上,因此您没有担心这些。 WithCurrentCulture() 仅适用于您希望通过避免额外的上下文切换来优化代码的情况。

旁注:您还可以通过设置 CultureInfo.DefaultThreadCurrentCulture and CultureInfo.DefaultThreadCurrentUICulture.

来控制新线程的默认文化