使用调度程序在另一个线程上调用 - Config/Settings 在 .Net Core 3.1 中不是线程安全的

Using dispatcher to invoke on another thread - Config/Settings is not threadsafe in .Net Core 3.1

问题:

我正在尝试从第二个线程更新 GUI。 不幸的是,标签保持不变。起初我以为调度员有问题,但它工作正常。看来配置不是线程安全的!

重现代码:

我有一个设置文件,主要用于在应用程序重新启动期间保持变量的持久性:

这是更新代码:

// get the amount of tickets created for me last week
int amountOftickets = JiraInterface.DayStatisticsGenerator.GetLastWeeksTicketAmount();
config.Default.Lastweekstickets = amountOftickets; // int == 12;
// Update GUI on GUI thread
mainWindow.Dispatcher.Invoke(() =>
{
    mainWindow.SetIconsAccordingtoConfig();
    mainWindow.NumberTicketsCreated.Content = config.Default.Lastweekstickets.ToString(); // int == 0!!
});

有没有人知道如何将 运行 配置从更新它的线程推送到 Gui 线程?

快速查看文档后,您似乎有 2 个选择:

编辑 1: 更多地查看 C# 属性,似乎如果您查看 Visual Studio 下的配置文件:

  • 属性 -> Config.settings -> Config.Designer.cs

在 class 初始化期间,似乎 .NET Framework 已经使用了 Synhronized 属性,这应该使配置线程安全

private static Config defaultInstance = ((Config)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Config())));

可能是因为当你创建这个文件时,没有使用 Synchronized,所以你的配置文件不是线程安全的,特别是如果它是用代码创建的而不是 designer/properties

来自 Microsoft Docs on SettingsBase Synchronized:

The indexer will get and set property data in a thread-safe manner if the IsSynchronized property is set to true. A SettingsBase instance by default is not thread-safe. However, you can call Synchronized passing in a SettingsBase instance to make the SettingsBase indexer operate in a thread-safe manner.