问题描述
问题:
我正在尝试从第二个线程更新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来设置您的配置。默认 在GUI线程上。
- .NET Core和.NET Framework似乎支持同步的SettingsBase,这就是Configs(https://docs.microsoft.com/en-us/dotnet/api/system.configuration.settingsbase.synchronized?view=netcore-3.0)
编辑1: 进一步研究C#属性,看来如果您在Visual Studio中的配置文件中查找以下内容:
- 属性-> Config.settings-> Config.Designer.cs
在类初始化期间,.NET Framework似乎已经使用了Synhronized属性,这应使配置线程安全
private static Config defaultInstance = ((Config)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Config())));
可能是在您创建此文件时未使用同步的,因此您的配置文件不是线程安全的,尤其是如果它是用代码而不是设计者/属性创建的
来自同步SettingsSetBase上的Microsoft文档:
如果IsSynchronized属性设置为true,则索引器将以线程安全的方式获取和设置属性数据。默认情况下,SettingsBase实例不是线程安全的。但是,您可以在SettingsBase实例中调用“同步传递”,以使SettingsBase索引器以线程安全的方式运行。