diff --git a/src/Discord.Net/Collections/AsyncCollection.cs b/src/Discord.Net/Collections/AsyncCollection.cs index 9b57d7015..c6acb6b63 100644 --- a/src/Discord.Net/Collections/AsyncCollection.cs +++ b/src/Discord.Net/Collections/AsyncCollection.cs @@ -9,7 +9,7 @@ namespace Discord.Collections public abstract class AsyncCollection : IEnumerable where TValue : class { - private static readonly object _writerLock = new object(); + private readonly object _writerLock; internal class CollectionItemEventArgs : EventArgs { @@ -53,9 +53,10 @@ namespace Discord.Collections protected readonly DiscordClient _client; protected readonly ConcurrentDictionary _dictionary; - protected AsyncCollection(DiscordClient client) + protected AsyncCollection(DiscordClient client, object writerLock) { _client = client; + _writerLock = writerLock; _dictionary = new ConcurrentDictionary(); } diff --git a/src/Discord.Net/Collections/Channels.cs b/src/Discord.Net/Collections/Channels.cs index ae0e4060c..5207abb36 100644 --- a/src/Discord.Net/Collections/Channels.cs +++ b/src/Discord.Net/Collections/Channels.cs @@ -6,8 +6,8 @@ namespace Discord.Collections { public sealed class Channels : AsyncCollection { - internal Channels(DiscordClient client) - : base(client) { } + internal Channels(DiscordClient client, object writerLock) + : base(client, writerLock) { } internal Channel GetOrAdd(string id, string serverId, string recipientId = null) => GetOrAdd(id, () => new Channel(_client, id, serverId, recipientId)); internal new Channel TryRemove(string id) => base.TryRemove(id); diff --git a/src/Discord.Net/Collections/Members.cs b/src/Discord.Net/Collections/Members.cs index 2ccc502f7..282915353 100644 --- a/src/Discord.Net/Collections/Members.cs +++ b/src/Discord.Net/Collections/Members.cs @@ -6,8 +6,8 @@ namespace Discord.Collections { public sealed class Members : AsyncCollection { - internal Members(DiscordClient client) - : base(client) { } + internal Members(DiscordClient client, object writerLock) + : base(client, writerLock) { } private string GetKey(string userId, string serverId) => serverId + '_' + userId; diff --git a/src/Discord.Net/Collections/Messages.cs b/src/Discord.Net/Collections/Messages.cs index 6c59a9233..2c353322b 100644 --- a/src/Discord.Net/Collections/Messages.cs +++ b/src/Discord.Net/Collections/Messages.cs @@ -5,8 +5,8 @@ namespace Discord.Collections public sealed class Messages : AsyncCollection { private readonly MessageCleaner _msgCleaner; - internal Messages(DiscordClient client) - : base(client) + internal Messages(DiscordClient client, object writerLock) + : base(client, writerLock) { _msgCleaner = new MessageCleaner(client); } diff --git a/src/Discord.Net/Collections/Roles.cs b/src/Discord.Net/Collections/Roles.cs index 8c63a2200..10557e616 100644 --- a/src/Discord.Net/Collections/Roles.cs +++ b/src/Discord.Net/Collections/Roles.cs @@ -6,8 +6,8 @@ namespace Discord.Collections { public sealed class Roles : AsyncCollection { - internal Roles(DiscordClient client) - : base(client) { } + internal Roles(DiscordClient client, object writerLock) + : base(client, writerLock) { } internal Role GetOrAdd(string id, string serverId) => GetOrAdd(id, () => new Role(_client, id, serverId)); internal new Role TryRemove(string id) => base.TryRemove(id); diff --git a/src/Discord.Net/Collections/Servers.cs b/src/Discord.Net/Collections/Servers.cs index 85e243c6e..d1f6b9245 100644 --- a/src/Discord.Net/Collections/Servers.cs +++ b/src/Discord.Net/Collections/Servers.cs @@ -6,8 +6,8 @@ namespace Discord.Collections { public sealed class Servers : AsyncCollection { - internal Servers(DiscordClient client) - : base(client) { } + internal Servers(DiscordClient client, object writerLock) + : base(client, writerLock) { } internal Server GetOrAdd(string id) => base.GetOrAdd(id, () => new Server(_client, id)); internal new Server TryRemove(string id) => base.TryRemove(id); diff --git a/src/Discord.Net/Collections/Users.cs b/src/Discord.Net/Collections/Users.cs index 56ffb060c..11f301aaf 100644 --- a/src/Discord.Net/Collections/Users.cs +++ b/src/Discord.Net/Collections/Users.cs @@ -6,8 +6,8 @@ namespace Discord.Collections { public sealed class Users : AsyncCollection { - internal Users(DiscordClient client) - : base(client) { } + internal Users(DiscordClient client, object writerLock) + : base(client, writerLock) { } internal User GetOrAdd(string id) => GetOrAdd(id, () => new User(_client, id)); internal new User TryRemove(string id) => base.TryRemove(id); diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 8e1856cec..c3af7dcca 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -136,12 +136,13 @@ namespace Discord }; } - _channels = new Channels(this); - _members = new Members(this); - _messages = new Messages(this); - _roles = new Roles(this); - _servers = new Servers(this); - _users = new Users(this); + object cacheLock = new object(); + _channels = new Channels(this, cacheLock); + _members = new Members(this, cacheLock); + _messages = new Messages(this, cacheLock); + _roles = new Roles(this, cacheLock); + _servers = new Servers(this, cacheLock); + _users = new Users(this, cacheLock); _dataSocket.LogMessage += (s, e) => RaiseOnLog(e.Severity, LogMessageSource.DataWebSocket, e.Message); if (_config.EnableVoice) @@ -645,9 +646,6 @@ namespace Discord string token; try { - var cancelToken = new CancellationTokenSource(); - cancelToken.CancelAfter(5000); - _api.CancelToken = cancelToken.Token; var response = await _api.Login(email, password).ConfigureAwait(false); token = response.Token; if (_config.LogLevel >= LogMessageSeverity.Verbose)