Wpf 在.Net Core 3.1中,使用dispatcher在另一个线程上调用-Config/Settings不是线程安全的 问题:

Wpf 在.Net Core 3.1中,使用dispatcher在另一个线程上调用-Config/Settings不是线程安全的 问题:,wpf,multithreading,.net-core,configuration,dispatcher,Wpf,Multithreading,.net Core,Configuration,Dispatcher,我正在尝试从第二个线程更新GUI。 不幸的是,标签保持不变。起初我认为调度器有问题,但它工作正常。配置似乎不是线程安全的 要复制的代码: 我有一个设置文件,主要用于在应用程序重新启动期间保持变量的持久性: 这是更新代码: // get the amount of tickets created for me last week int amountOftickets = JiraInterface.DayStatisticsGenerator.GetLastWeeksTicketAmount(

我正在尝试从第二个线程更新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线程吗?

快速查看文档后,您似乎有两个选项:

  • 您可以使用Dispatcher.Invoke来设置config.Default 在GUI线程上
  • 似乎.NET Core和.NET Framework支持同步设置数据库,这就是配置()
编辑1: 进一步查看C#属性,如果您在Visual Studio中的配置文件中查看以下内容:

  • 属性->配置设置->配置设计器.cs
在类初始化期间,.NET Framework似乎已经使用了Synhronized属性,这应该使配置线程安全

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

可能是创建此文件时未使用Synchronized,因此您的配置文件不是线程安全的,特别是如果它是在代码中而不是在designer/properties中创建的

从Microsoft文档开始设置数据库已同步:

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