Beispiel #1
0
        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();
        }
Beispiel #2
0
        /*
         * /// <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();
        }
Beispiel #3
0
        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();
        }
Beispiel #4
0
        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();
        }
Beispiel #5
0
        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);
            });
        }