diff --git a/Realtime/Realtime.Test/Throttle.cs b/Realtime/Realtime.Test/Throttle.cs new file mode 100644 index 0000000..f25c651 --- /dev/null +++ b/Realtime/Realtime.Test/Throttle.cs @@ -0,0 +1,71 @@ +using NUnit.Framework; +using System; +using System.Threading.Tasks; +using LeanCloud; +using LeanCloud.Realtime; +using LeanCloud.Realtime.Internal.Protocol; + +namespace Realtime.Test { + public class Throttle { + private LCIMClient c1; + private LCIMClient c2; + + private LCIMConversation conversation; + + [SetUp] + public async Task SetUp() { + LCLogger.LogDelegate += Utils.Print; + LCApplication.Initialize("ikGGdRE2YcVOemAaRbgp1xGJ-gzGzoHsz", "NUKmuRbdAhg1vrb2wexYo1jo", "https://ikggdre2.lc-cn-n1-shared.com"); + c1 = new LCIMClient(Guid.NewGuid().ToString()); + c2 = new LCIMClient(Guid.NewGuid().ToString()); + await c1.Open(); + await c2.Open(); + + conversation = await c1.CreateConversation(new string[] { Guid.NewGuid().ToString() }); + } + + [TearDown] + public async Task TearDown() { + await c1.Close(); + await c2.Close(); + LCLogger.LogDelegate -= Utils.Print; + } + + [Test] + public void Equality() { + GenericCommand cmd1 = new GenericCommand { + Cmd = CommandType.Session, + Op = OpType.Open, + PeerId = "hello", + I = 1, + SessionMessage = new SessionCommand { + Code = 123 + } + }; + GenericCommand cmd2 = new GenericCommand { + Cmd = CommandType.Session, + Op = OpType.Open, + PeerId = "hello", + I = 2, + SessionMessage = new SessionCommand { + Code = 123 + } + }; + Assert.IsFalse(Equals(cmd1, cmd2)); + cmd2.I = cmd1.I; + Assert.IsTrue(Equals(cmd1, cmd2)); + } + + [Test] + public async Task CreateSameConversation() { + Task t1 = conversation.RemoveMembers(new string[] { c2.Id }).ContinueWith(t => { + Assert.IsTrue(t.IsCompleted && !t.IsFaulted); + }); + Task t2 = conversation.RemoveMembers(new string[] { c2.Id }).ContinueWith(t => { + Assert.IsTrue(t.IsCompleted && !t.IsFaulted); + }); + + await Task.WhenAll(t1, t2); + } + } +} diff --git a/Realtime/Realtime/Internal/Connection/LCConnection.cs b/Realtime/Realtime/Internal/Connection/LCConnection.cs index 0c8de85..c4703fa 100644 --- a/Realtime/Realtime/Internal/Connection/LCConnection.cs +++ b/Realtime/Realtime/Internal/Connection/LCConnection.cs @@ -135,13 +135,14 @@ namespace LeanCloud.Realtime.Internal.Connection { request.I = item.I; return Equals(request, item); }); - if (sendingReq == null) { - sendingRequests.Add(request); - } else { + if (sendingReq != null) { LCLogger.Warn("duplicated request"); if (responses.TryGetValue(sendingReq.I, out TaskCompletionSource waitingTcs)) { return await waitingTcs.Task; } + LCLogger.Error($"error request: {request}"); + } else { + sendingRequests.Add(request); } }