ASP.NET Identity CultureAwaiter 代码
ASP.NET Identity CultureAwaiter Code
在 ASP.NET MVC 应用程序的开发过程中,我遇到了 CultureAwaiter
,它的一个实例在调用扩展方法 WithCurrentCulture
.
时返回
我对 Microsoft 的异步模型比较陌生,所以我很难理解我在下面标记的代码中的四行代码背后的直觉。请注意,我使用 ILSpy 从程序集文件版本“2.1.30612.0”中获取了此文件...我认为 MS 尚未向我们提供源代码。
在这四行中,我假设 运行 在同一个线程上同步,看起来变量 currentCulture
设置为当前线程的文化(到目前为止一切正常)。然而,两行之后,它只是获取该变量并将当前线程的文化设置给它(即只是反转赋值)。那有什么用?
另一方面,UI 文化在这四行中的行为略有不同。请注意变量名称中 'UI'/'Ui' 的大小写。在这四行中的第二行,变量 currentUICulture
被设置为当前线程的 UI 区域性(可能是 "remember" 以备后用)。两行之后,当前线程的 UI 文化被设置为不同的变量 currentUiCulture
(注意不同的大小写)...在方法开始时定义。
撇开我对异步模型的新手理解不谈,我至少希望 CurrentCulture 和 CurrentUICulture 在此方法中具有相同的 getting/setting 行为。我可能完全错了,但我的 "gut" 感觉告诉我那四行中可能发生了不正确的分配。
任何人都可以根据我的理解阐明这一点吗?它可能与 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;
}
});
}
在 ASP.NET MVC 应用程序的开发过程中,我遇到了 CultureAwaiter
,它的一个实例在调用扩展方法 WithCurrentCulture
.
我对 Microsoft 的异步模型比较陌生,所以我很难理解我在下面标记的代码中的四行代码背后的直觉。请注意,我使用 ILSpy 从程序集文件版本“2.1.30612.0”中获取了此文件...我认为 MS 尚未向我们提供源代码。
在这四行中,我假设 运行 在同一个线程上同步,看起来变量 currentCulture
设置为当前线程的文化(到目前为止一切正常)。然而,两行之后,它只是获取该变量并将当前线程的文化设置给它(即只是反转赋值)。那有什么用?
另一方面,UI 文化在这四行中的行为略有不同。请注意变量名称中 'UI'/'Ui' 的大小写。在这四行中的第二行,变量 currentUICulture
被设置为当前线程的 UI 区域性(可能是 "remember" 以备后用)。两行之后,当前线程的 UI 文化被设置为不同的变量 currentUiCulture
(注意不同的大小写)...在方法开始时定义。
撇开我对异步模型的新手理解不谈,我至少希望 CurrentCulture 和 CurrentUICulture 在此方法中具有相同的 getting/setting 行为。我可能完全错了,但我的 "gut" 感觉告诉我那四行中可能发生了不正确的分配。
任何人都可以根据我的理解阐明这一点吗?它可能与 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;
}
});
}