From 5308c8840b59000cbb742945db4deb0f36074141 Mon Sep 17 00:00:00 2001 From: Foglio Date: Tue, 2 Apr 2024 11:51:48 +0200 Subject: [PATCH] use locks in GuildInfo for underlying list --- TCC.Core/Data/GuildInfo.cs | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/TCC.Core/Data/GuildInfo.cs b/TCC.Core/Data/GuildInfo.cs index 0b196ff5..c18a5995 100644 --- a/TCC.Core/Data/GuildInfo.cs +++ b/TCC.Core/Data/GuildInfo.cs @@ -8,6 +8,7 @@ namespace TCC.Data; public class GuildInfo { + readonly object _lock = new object(); readonly ThreadSafeObservableCollection _members = []; public bool InGuild { get; private set; } @@ -16,7 +17,11 @@ public class GuildInfo public string NameOf(uint id) { - var found = _members.ToSyncList().FirstOrDefault(m => m.PlayerId == id); + GuildMemberData found; + lock (_lock) + { + found = _members.ToSyncList().FirstOrDefault(m => m.PlayerId == id); + } return found.Name != "" ? found.Name : "Unknown player"; @@ -24,9 +29,12 @@ public string NameOf(uint id) public void Set(List newMembers, uint masterId, string masterName) { - foreach (var member in newMembers.Where(x => !Has(x.Name))) + lock (_lock) { - _members.Add(member); + foreach (var member in newMembers.Where(x => !Has(x.Name))) + { + _members.Add(member); + } } InGuild = true; SetMaster(masterId, masterName); @@ -34,12 +42,22 @@ public void Set(List newMembers, uint masterId, string masterNa public bool Has(string name) { - return _members.ToSyncList().Exists(m => m.Name == name); + bool ret = false; + + lock (_lock) + { + ret = _members.ToSyncList().Exists(m => m.Name == name); + } + return ret; } public void Clear() { - Task.Run(() => _members.Clear()); + lock (_lock) + { + _members.Clear(); + } + InGuild = false; Master = default; AmIMaster = false;