gpt4 book ai didi

c# - CallContext - 值消失 - WPF

转载 作者:太空狗 更新时间:2023-10-30 01:31:43 24 4
gpt4 key购买 nike

我正在使用 Visual Studio 2015 和 .Net

我遇到了一个有点奇怪的问题。我有一个包含两个项目的 C# 解决方案。一个是标准 WPF 应用程序,另一个是 WPF 用户控件库。 WPF 应用程序项目是启动项目。在每个项目中,我都有一个窗口。在启动项目中,我打开窗口并使用 CallContext.LogicalSetData 在逻辑调用上下文中设置一个值。 .这是在加载时完成的。然后我关闭窗口并在 WPF 用户控件库中打开窗口。我用逻辑调用上下文中的值填充一个文本框(使用 CallContext.LogicalGetData ),这工作正常。我有一个按钮,单击该按钮会触发一个事件,该事件使用逻辑调用上下文中的相同值填充另一个文本框——但突然之间,该值变为空。

我可以简单地通过更改启动窗口使其工作,而不是在加载时执行它的“事情”,而是在按钮事件上执行。

启动窗口代码:

public partial class MainWindow : Window
{
public MainWindow()
{
this.Loaded += OnLoaded;
InitializeComponent();
}

private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
CallContext.LogicalSetData("test", "value set onload");
TestWindow win = new TestWindow();
win.Show();
this.Close();
}

private void button_Click(object sender, RoutedEventArgs e)
{
CallContext.LogicalSetData("test", "value set on button event");
TestWindow win = new TestWindow();
win.Show();
this.Close();
}
}

如上所述,如果我注释掉OnLoaded中的四行方法然后它工作正常。

另一个窗口:

    public partial class TestWindow : Window
{
public TestWindow()
{
InitializeComponent();
PreLoadedText.Text = CallContext.LogicalGetData("test") as string;
}

private void GetValue_Click(object sender, RoutedEventArgs e)
{
string eventTextText = CallContext.LogicalGetData("test") as string;
EventText.Text = eventTextText ?? "The value is null";
}
}

顺便说一句。我尝试使用 AsyncLocal<T>类 - 但我刚刚遇到了同样的问题。

示例解决方案可以在这里找到: Visual studio solution as zip file

注意 - 我不是在寻找解决方法(我有几个),我是在寻找发生这种情况的原因。

最佳答案

因为Thread.CurrentThread.ExecutionContext的实例,其中包含 DataStoreCallContext , 调用之间的变化。您可以通过在 Visual Studio 调试器中使用“创建对象 ID”来检查是否给它一个标记。

为什么会这样?我完全不知道。我尝试调试 .net Framework 源代码,但没有任何运气。

至于AsyncLocal<T>关注:它也使用相同的Thread.CurrentThread.ExecutionContext因此也遇到了同样的问题。

如果您使用 ThreadLocal<T> 则不会发生这种情况因为那正在使用 [ThreadStatic]Thread本身不会改变。

关于c# - CallContext - 值消失 - WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40045468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com