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

Mik*_*ond 5 c# asp.net asp.net-identity

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

从文档

配置用于等待此任务的awaiter,以避免将延续编组回原始上下文,但保留当前的文化和UI文化.

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

AJ *_*son 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!
Run Code Online (Sandbox Code Playgroud)

如果你想让文化保持不变await,请使用WithCurrentCulture().它做同样的事情ConfigureAwait(false),但也保持文化与原始线程.

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

bool equal = Thread.CurrentThread.CurrentCulture == someCulture; // Will be true
Run Code Online (Sandbox Code Playgroud)

请注意,如果你省略ConfigureAwait(false)WithCurrentCulture(),之后的代码await将在同一线程上像以前一样运行,所以你不必担心任何这一点.WithCurrentCulture()仅适用于您希望通过避免额外的上下文切换来优化代码的情况.

附注:您还可以通过设置CultureInfo.DefaultThreadCurrentCulture和控制新线程的默认区域性CultureInfo.DefaultThreadCurrentUICulture.

  • 这可以解释为什么在使用我的DI容器在使用`WithCurrentCulture()`调用之后使用`PerRequestLifetimeManager`创建任何内容时出现错误,因为新线程无法访问HttpContext. (2认同)