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

7
我试图理解Asp.net Identity系统的内部工作原理,并发现它似乎使用了WithCurrentCulture()任务扩展中的所有async调用。我查看了该扩展的源代码,但是我无法弄清楚它在做什么或者为什么要这样做。
从文档中可以得到以下信息:

配置一个awaiter,用于等待此任务以避免将继续返回到原始上下文,但保留当前的文化和UI文化。

请问有人能解释一下吗?
2个回答

6

该方法使用与调用线程相同的线程区域设置(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.DefaultThreadCurrentCultureCultureInfo.DefaultThreadCurrentUICulture来控制新线程的默认区域设置。

所以如果我理解你的意思正确的话,如果你使用WithCurrentCulture,那么在await之后的线程将会是一个新的线程,但它的文化设置将与原始调用线程相同? - Mike Dymond
2
这就解释了为什么我在使用DI容器创建任何带有PerRequestLifetimeManager的内容时,在调用WithCurrentCulture()后出现错误,因为新线程无法访问HttpContext。 - Mike Dymond
看起来在 .NET 5 中已经被移除了?是这样吗?有什么替代品吗? - bunjeeb

0

我的理解是它将请求的区域信息从当前线程传递到可等待线程中。否则,可等待线程将在默认区域设置下运行,当您处理日期、语言等时会带来很大的麻烦。


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