我试图了解Asp.net身份系统的内部工作原理,并且已经看到所有async
调用它似乎都使用了WithCurrentCulture()
任务扩展。我查看了该扩展的源代码,我无法弄清楚它正在做什么或为什么。
来自文档
配置一个等待此任务的等待者,以避免将延续编组回原始上下文,但保留当前的文化和UI文化。
有人可以对此有所了解吗?
答案 0 :(得分:6)
它执行任务继续,Thread.CurrentCulture
和Thread.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
和CultureInfo.DefaultThreadCurrentUICulture
来控制新主题的默认文化。
答案 1 :(得分:0)
我的理解是它将请求的文化信息从当前线程传递到等待的线程中。否则,这个等待的线程将在默认文化中运行,当你处理日期,语言等时会引起很大的麻烦。