* Throttle.cs:
* LCConnection.cs: chore: 支持节流
parent
005752e748
commit
4a6cf1ea09
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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<GenericCommand> waitingTcs)) {
|
||||
return await waitingTcs.Task;
|
||||
}
|
||||
LCLogger.Error($"error request: {request}");
|
||||
} else {
|
||||
sendingRequests.Add(request);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue