使用调度程序在另一个线程上调用 - 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 个选择:
- 您可以使用 Dispatcher.Invoke 来设置您的 config.Default
在 GUI 线程上。
- .NET Core 和 .NET Framework 似乎支持同步的 SettingsBase,这就是配置 (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
在 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.
问题:
我正在尝试从第二个线程更新 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 个选择:
- 您可以使用 Dispatcher.Invoke 来设置您的 config.Default 在 GUI 线程上。
- .NET Core 和 .NET Framework 似乎支持同步的 SettingsBase,这就是配置 (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
在 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.