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

问题描述

问题:

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

要复制的代码

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

enter image description here

这是更新代码

// 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线程的线程中产生想法吗?

解决方法

快速浏览文档后,您似乎有两个选择:

编辑1: 进一步研究C#属性,看来如果您在Visual Studio中的配置文件中查找以下内容:

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

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

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

Example of our config

可能是在您创建此文件时未使用同步的,因此您的配置文件不是线程安全的,尤其是如果它是用代码而不是设计者/属性创建的

来自同步SettingsSetBase上的Microsoft文档:

如果IsSynchronized属性设置为true,则索引器将以线程安全的方式获取和设置属性数据。默认情况下,SettingsBase实例不是线程安全的。但是,您可以在SettingsBase实例中调用“同步传递”,以使SettingsBase索引器以线程安全的方式运行。