Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
.net WPF中的AsyncLocal在同一线程上首次设置后为null_.net_Wpf - Fatal编程技术网

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

.net WPF中的AsyncLocal在同一线程上首次设置后为null,.net,wpf,.net,Wpf,请帮助我理解这一点: 在我的WPF.NET4.6.2应用程序中,我正在尝试使用AsyncLocal来处理登录并在线程上设置经过身份验证的用户。问题归结为这段简化的代码。在加载的事件中,我在主线程上设置了一个默认值。在点击按钮的处理程序中,我假设这个默认值仍然存在,但它不是。现在AsyncLocal值消失,并再次返回为null。我已经检查了很多次,线程始终是相同的主线程,具有相同的id。为什么这不能像我预期的那样工作 public partial class MainWindow : Window

请帮助我理解这一点:

在我的WPF.NET4.6.2应用程序中,我正在尝试使用AsyncLocal来处理登录并在线程上设置经过身份验证的用户。问题归结为这段简化的代码。在加载的事件中,我在主线程上设置了一个默认值。在点击按钮的处理程序中,我假设这个默认值仍然存在,但它不是。现在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
  }
}

正如注释中所指出的,执行上下文在加载事件后被清除。因此,我基本上不打算在这一点之前设置AsyncLocal,也不希望在我知道这不是一个选项的情况下它能够工作。事实证明,我并不真的需要它,只是想知道它为什么不起作用。

当您使用允许使用动作回调的AsyncLocal构造函数时,您可以找到这一点。在回调方法上设置断点可以让您看到,当应用程序到达应用程序时,WPF会做一些相当糟糕的事情。加载后运行,它会重置线程的执行上下文。这会让你失去价值。在这里很难给出好的建议,不要这样做。这是唯一可靠的建议。我明白了。我可以这样做。如果您想了解要点,请添加一个答案=当然WPF程序员对您的问题更感兴趣,我可以使用这种方法。不知道你会怎么做。只需发布你自己的答案。哎哟。。。我不是有意冒犯你的,只是感兴趣而已。