public async Task DoubleBufferTaskWithMultiThreadReadAndWrite(int threadCount) { var doubleBufferTask = new DoubleBufferTask <List <Foo>, Foo>(new List <Foo>(MaxCount), new List <Foo>(MaxCount), list => Task.CompletedTask); var foo = new Foo(); var taskList = new Task[threadCount]; for (int j = 0; j < threadCount; j++) { var task = Task.Run(() => { for (int i = 0; i < MaxCount / threadCount; i++) { doubleBufferTask.AddTask(foo); } }); taskList[j] = task; } await Task.WhenAll(taskList); doubleBufferTask.Finish(); await doubleBufferTask.WaitAllTaskFinish(); }
/* * /// <summary> * /// 向服务器端发送收到某条消息,或用于回复某条消息已收到 * /// </summary> * /// <param name="receivedAck"></param> * /// <returns></returns> * /// 不需要回复,因为如果消息能发送过去到对方,就是对方收到消息了 * [Obsolete(DebugContext.DoNotUseAck)] * public async Task SendAckAsync(Ack receivedAck) * { * Logger.Debug($"[{nameof(IpcClientService)}][{nameof(SendAckAsync)}] {receivedAck} Start AddTaskAsync"); * * var ackMessage = AckManager.BuildAckMessage(receivedAck); * * // 这里不能调用 WriteMessageAsync 方法,因为这些方法都使用了 QueueWriteAsync 方法,在这里面将会不断尝试发送信息,需要收到对方的 ack 才能完成。而作为回复 ack 消息的逻辑,如果还需要等待对方回复 ack 那么将会存在相互等待。本地回复对方的 ack 消息需要等待对方的 ack 消息,而对方的 ack 消息又需要等待本地的回复 * await DoubleBufferTask.AddTaskAsync(async () => * { * await IpcMessageConverter.WriteAsync * ( * NamedPipeClientStream, * IpcConfiguration.MessageHeader, * ack: IpcContext.AckUsedForReply, * // 需要使用框架的命令 * ipcMessageCommandType: IpcMessageCommandType.SendAck, * buffer: ackMessage, * offset: 0, * count: ackMessage.Length, * summary: nameof(SendAckAsync), * Logger * ); * await NamedPipeClientStream.FlushAsync(); * }); * } */ /// <inheritdoc /> public void Dispose() { if (IsDisposed) { return; } IsDisposed = true; NamedPipeClientStream.Dispose(); DoubleBufferTask.Finish(); }
public async Task DoubleBufferTaskReadAndWrite() { var doubleBufferTask = new DoubleBufferTask <Foo>(list => Task.CompletedTask); var foo = new Foo(); for (int i = 0; i < MaxCount; i++) { doubleBufferTask.AddTask(foo); } doubleBufferTask.Finish(); await doubleBufferTask.WaitAllTaskFinish(); }
public async Task DoubleBufferTaskWithCapacityReadAndWrite() { var doubleBufferTask = new DoubleBufferTask <List <Foo>, Foo>(new List <Foo>(MaxCount), new List <Foo>(MaxCount), list => Task.CompletedTask); var foo = new Foo(); for (int i = 0; i < MaxCount; i++) { doubleBufferTask.AddTask(foo); } doubleBufferTask.Finish(); await doubleBufferTask.WaitAllTaskFinish(); }
public void DoAll() { "多线程加入任务,任务执行速度比加入快,可以等待所有任务执行完成".Test(() => { var mock = new Mock <IFoo>(); mock.Setup(foo => foo.Foo()); var doubleBufferTask = new DoubleBufferTask <IFoo>(list => { foreach (var foo in list) { foo.Foo(); } return(Task.CompletedTask); }); const int n = 10; var taskArray = new Task[100]; for (int i = 0; i < taskArray.Length; i++) { taskArray[i] = Task.Run(async() => { for (int j = 0; j < n; j++) { await Task.Delay(TimeSpan.FromMilliseconds(50)); doubleBufferTask.AddTask(mock.Object); } }); } Task.WhenAll(taskArray).ContinueWith(_ => doubleBufferTask.Finish()); doubleBufferTask.WaitAllTaskFinish().Wait(); mock.Verify(foo => foo.Foo(), Times.Exactly(n * taskArray.Length)); }); "多线程加入任务,可以等待所有任务执行完成".Test(() => { var mock = new Mock <IFoo>(); mock.Setup(foo => foo.Foo()); var doubleBufferTask = new DoubleBufferTask <IFoo>(async list => { foreach (var foo in list) { await Task.Delay(TimeSpan.FromMilliseconds(10)); foo.Foo(); } }); const int n = 10; var taskArray = new Task[10]; for (int i = 0; i < taskArray.Length; i++) { taskArray[i] = Task.Run(async() => { for (int j = 0; j < n; j++) { await Task.Delay(TimeSpan.FromMilliseconds(50)); doubleBufferTask.AddTask(mock.Object); } }); } Task.WhenAll(taskArray).ContinueWith(_ => doubleBufferTask.Finish()); doubleBufferTask.WaitAllTaskFinish().Wait(); mock.Verify(foo => foo.Foo(), Times.Exactly(n * taskArray.Length)); }); "没有加入任务,等待完成,可以等待完成".Test(() => { var mock = new Mock <IFoo>(); mock.Setup(foo => foo.Foo()); var doubleBufferTask = new DoubleBufferTask <IFoo>(async list => { foreach (var foo in list) { await Task.Delay(TimeSpan.FromMilliseconds(50)); foo.Foo(); } }); doubleBufferTask.Finish(); doubleBufferTask.WaitAllTaskFinish().Wait(); // 没有执行一次 mock.Verify(foo => foo.Foo(), Times.Never); }); }