c# - ASP.NET Identity CultureAwaiter 代码

标签 c# asynchronous asp.net-identity culture

在 ASP.NET MVC 应用程序的开发过程中,我遇到了 CultureAwaiter,它的一个实例在调用扩展方法 WithCurrentCulture 时返回。

我对 Microsoft 的异步模型比较陌生,所以我很难理解我在下面标记的代码中的四行代码背后的直觉。请注意,我使用 ILSpy 从程序集文件版本“2.1.30612.0”中获取了此文件...我认为 MS 尚未向我们提供源代码。

在我假设在同一线程上同步运行的那四行代码中,变量 currentCulture 似乎设置为当前线程的文化(到目前为止一切正常)。然而,两行之后,它只是获取该变量并将当前线程的文化设置给它(即只是反转赋值)。那有什么用呢?

另一方面,UI 文化在这四行中的行为略有不同。请注意变量名称中“UI”/“Ui”的大小写。在这四行中的第二行,变量 currentUICulture 被设置为当前线程的 UI 区域性(可能是为了“记住”它以备后用)。两行之后,当前线程的 UI 区域性设置为不同的变量 currentUiCulture(注意不同的大小写)......在方法的开头定义。

撇开我对异步模型的新手理解不谈,我至少希望 CurrentCulture 和 CurrentUICulture 在此方法中具有相同的获取/设置行为。我可能完全错了,但我的“直觉”告诉我,那四行中可能发生了错误的分配。

任何人都可以根据我的理解阐明这一点吗?它可能与 ILSpy 有关吗?

// Microsoft.AspNet.Identity.TaskExtensions.CultureAwaiter<T>
public void UnsafeOnCompleted(Action continuation)
{
    CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
    CultureInfo currentUiCulture = Thread.CurrentThread.CurrentUICulture;
    this._task.ConfigureAwait(false).GetAwaiter().UnsafeOnCompleted(delegate
    {
        // WHAT'S GOING ON IN THE NEXT FOUR LINES?
        CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
        CultureInfo currentUICulture = Thread.CurrentThread.CurrentUICulture;
        Thread.CurrentThread.CurrentCulture = currentCulture;
        Thread.CurrentThread.CurrentUICulture = currentUiCulture;
        try
        {
            continuation();
        }
        finally
        {
            Thread.CurrentThread.CurrentCulture = currentCulture;
            Thread.CurrentThread.CurrentUICulture = currentUICulture;
        }
    });
}

最佳答案

这样做的目的是使用当前的区域性设置运行延续,尽管它可能在不同的线程上运行。但是我们不想以持久的方式修改那个线程的文化,因为我们不拥有那个线程。它是共享的。所以我们必须在退出前恢复旧的设置。

反编译器可能只是显示了误导性的变量名。 Reflector 正确地做到了:

public void UnsafeOnCompleted(Action continuation)
{
    CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
    CultureInfo currentUiCulture = Thread.CurrentThread.CurrentUICulture;
    this._task.ConfigureAwait(false).GetAwaiter().UnsafeOnCompleted(delegate {
        CultureInfo info1 = Thread.CurrentThread.CurrentCulture;
        CultureInfo currentUICulture = Thread.CurrentThread.CurrentUICulture;
        Thread.CurrentThread.CurrentCulture = currentCulture;
        Thread.CurrentThread.CurrentUICulture = currentUiCulture;
        try
        {
            continuation();
        }
        finally
        {
            Thread.CurrentThread.CurrentCulture = info1;
            Thread.CurrentThread.CurrentUICulture = currentUICulture;
        }
    });
}

关于c# - ASP.NET Identity CultureAwaiter 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27877146/

相关文章:

c# - 如何编辑在 IdentityDbContext 中创建的表

ldap - OpenIddict 和 LDAP 可以一起使用吗?

c# - 自动调整winform中的控件大小

c# - 如何修剪字符串中的前导逗号

c# - 使用 C# 检查 gridview 是否为空

c# - 一台PC可以接入多少个USB摄像头

c# - 递归调用 async-void : any guarantee on the stack limit?

asynchronous - 控制衍生 future 的数量以产生背压

c# - 将回调对象转换为异步任务

asp.net-web-api - 什么是 AuthorizeEndpointPath?