首次在同一线程上设置后,WPF中的AsyncLocal为null

时间:2018-03-17 10:26:08

标签: .net wpf

帮助我理解这一点:

在我的WPF(.NET 4.6.2)应用程序中,我尝试使用AsyncLocal来处理登录并在线程上设置经过身份验证的用户。问题归结为这个简化的代码。在Loaded事件中,我在主线程上设置了一个默认值。在单击按钮的处理程序中,我假设此默认值仍然存在,但它不是。现在,AsyncLocal值已经消失,并再次返回null。我已经检查了很多次,并且线程始终是具有相同id的相同主线程。为什么这不像我预期的那样工作?

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

1 个答案:

答案 0 :(得分:0)

正如评论中所指出的,在Loaded事件之后清除执行上下文。所以我基本上没有尝试在那之前设置AsyncLocal,并期望现在可以工作,我知道这不是一个选项。事实证明,我并不是真的需要它,只是想知道它为什么不起作用。