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

时间:2015-02-05 02:26:36

标签: c# asp.net asp.net-identity

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

来自文档

  

配置一个等待此任务的等待者,以避免将延续编组回原始上下文,但保留当前的文化和UI文化。

有人可以对此有所了解吗?

2 个答案:

答案 0 :(得分: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来控制新主题的默认文化。

答案 1 :(得分:0)

我的理解是它将请求的文化信息从当前线程传递到等待的线程中。否则,这个等待的线程将在默认文化中运行,当你处理日期,语言等时会引起很大的麻烦。