Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET标识代码_C#_Asynchronous_Asp.net Identity_Culture - Fatal编程技术网

C# ASP.NET标识代码

C# ASP.NET标识代码,c#,asynchronous,asp.net-identity,culture,C#,Asynchronous,Asp.net Identity,Culture,在开发ASP.NET MVC应用程序的过程中,我遇到了CultureAwater,调用扩展方法WithCurrentCulture时返回了该应用程序的一个实例 我对微软的异步模型还比较陌生,所以我很难理解下面代码中四行代码背后的直觉。请注意,我使用ILSpy从程序集文件版本“2.1.30612.0”中获取了这一信息……我认为MS尚未提供源代码供我们查看 在我假设在同一线程上同步运行的这四行中,变量currentCulture似乎被设置为当前线程的区域性(到目前为止还不错)。但是,两行之后,它只接

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

我对微软的异步模型还比较陌生,所以我很难理解下面代码中四行代码背后的直觉。请注意,我使用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;
        }
    });
}
//Microsoft.AspNet.Identity.TaskExtensions.CultureAwater
未完成的公共无效(操作继续)
{
CultureInfo currentCulture=Thread.CurrentThread.currentCulture;
CultureInfo currentUiCulture=Thread.CurrentThread.currentUiCulture;
此._task.ConfigureAwait(false).GetAwaiter().UnsafeOnCompleted(委托
{
//接下来的四行是什么?
CultureInfo currentCulture=Thread.CurrentThread.currentCulture;
CultureInfo currentUICulture=Thread.CurrentThread.currentUICulture;
Thread.CurrentThread.CurrentCulture=CurrentCulture;
Thread.CurrentThread.CurrentUICulture=CurrentUICulture;
尝试
{
续();
}
最后
{
Thread.CurrentThread.CurrentCulture=CurrentCulture;
Thread.CurrentThread.CurrentUICulture=CurrentUICulture;
}
});
}

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

反编译器可能只是显示误导性的变量名。反射镜是否正确:

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;
        }
    });
}

谢谢你的回答。听起来像是为反射器付费的理由:)。