.net WPF中的AsyncLocal在同一线程上首次设置后为null
请帮助我理解这一点: 在我的WPF.NET4.6.2应用程序中,我正在尝试使用AsyncLocal来处理登录并在线程上设置经过身份验证的用户。问题归结为这段简化的代码。在加载的事件中,我在主线程上设置了一个默认值。在点击按钮的处理程序中,我假设这个默认值仍然存在,但它不是。现在AsyncLocal值消失,并再次返回为null。我已经检查了很多次,线程始终是相同的主线程,具有相同的id。为什么这不能像我预期的那样工作.net WPF中的AsyncLocal在同一线程上首次设置后为null,.net,wpf,.net,Wpf,请帮助我理解这一点: 在我的WPF.NET4.6.2应用程序中,我正在尝试使用AsyncLocal来处理登录并在线程上设置经过身份验证的用户。问题归结为这段简化的代码。在加载的事件中,我在主线程上设置了一个默认值。在点击按钮的处理程序中,我假设这个默认值仍然存在,但它不是。现在AsyncLocal值消失,并再次返回为null。我已经检查了很多次,线程始终是相同的主线程,具有相同的id。为什么这不能像我预期的那样工作 public partial class MainWindow : Window
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public static AsyncLocal<object> Test = new AsyncLocal<object>();
private void Button_Click(object sender, RoutedEventArgs e)
{
if (Test.Value == null) // same main thread here as well
{
Test.Value = 2; // should not get here?
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Test.Value = 1; // get here on main thread
}
}
正如注释中所指出的,执行上下文在加载事件后被清除。因此,我基本上不打算在这一点之前设置AsyncLocal,也不希望在我知道这不是一个选项的情况下它能够工作。事实证明,我并不真的需要它,只是想知道它为什么不起作用。当您使用允许使用动作回调的AsyncLocal构造函数时,您可以找到这一点。在回调方法上设置断点可以让您看到,当应用程序到达应用程序时,WPF会做一些相当糟糕的事情。加载后运行,它会重置线程的执行上下文。这会让你失去价值。在这里很难给出好的建议,不要这样做。这是唯一可靠的建议。我明白了。我可以这样做。如果您想了解要点,请添加一个答案=当然WPF程序员对您的问题更感兴趣,我可以使用这种方法。不知道你会怎么做。只需发布你自己的答案。哎哟。。。我不是有意冒犯你的,只是感兴趣而已。