Beispiel #1
0
        /// <summary>
        /// 连接其他端,用来发送
        /// </summary>
        /// <param name="ipcContext"></param>
        /// <param name="peerName">对方</param>
        internal IpcClientService(IpcContext ipcContext, string peerName = IpcContext.DefaultPipeName)
        {
            IpcContext = ipcContext;
            PeerName   = peerName;

            DoubleBufferTask = new DoubleBufferTask <Func <Task> >(DoTask);
        }
Beispiel #2
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 #3
0
 private async Task QueueWriteAsync(Func <Ack, Task> task)
 {
     await DoubleBufferTask.AddTaskAsync(async() =>
     {
         await AckManager.DoWillReceivedAck(task, PeerName, TimeSpan.FromSeconds(3), maxRetryCount: 10);
     });
 }
Beispiel #4
0
        public static async Task AddTaskAsync(this DoubleBufferTask <Func <Task> > doubleBufferTask, Func <Task> task)
        {
            var taskCompletionSource = new TaskCompletionSource <bool>();

            doubleBufferTask.AddTask(async() =>
            {
                await task();
                taskCompletionSource.SetResult(true);
            });

            await taskCompletionSource.Task;
        }
Beispiel #5
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 #6
0
        public void SetConfiguration(FileLoggerConfiguration configuration)
        {
            if (FileLoggerConfiguration != null)
            {
                throw new InvalidOperationException($"重复多次设置日志文件");
            }

            FileLoggerConfiguration = configuration.Clone();

            DoubleBufferTask.OnInitialized();

            IsInitialized = true;
        }
Beispiel #7
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 #8
0
        /// <summary>
        /// 向服务端发送消息
        /// </summary>
        /// <remarks>
        /// 框架层使用的
        /// </remarks>
        internal async Task WriteMessageAsync(IpcBufferMessageContext ipcBufferMessageContext)
        {
            await DoubleBufferTask.AddTaskAsync(WriteMessageAsyncInner);

            async Task WriteMessageAsyncInner()
            {
                await IpcMessageConverter.WriteAsync
                (
                    NamedPipeClientStream,
                    IpcConfiguration.MessageHeader,
                    AckManager.GetAck(),
                    ipcBufferMessageContext,
                    Logger
                );

                await NamedPipeClientStream.FlushAsync();
            }
        }
Beispiel #9
0
        /// <summary>
        /// 向服务端发送消息
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="offset"></param>
        /// <param name="count"></param>
        /// <param name="summary">这一次写入的是什么内容,用于调试</param>
        /// <returns></returns>
        /// <remarks>
        /// 业务层使用的
        /// </remarks>
        public async Task WriteMessageAsync(byte[] buffer, int offset, int count,
                                            [CallerMemberName] string summary = null !)
        {
            await DoubleBufferTask.AddTaskAsync(WriteMessageAsyncInner);

            async Task WriteMessageAsyncInner()
            {
                await IpcMessageConverter.WriteAsync
                (
                    NamedPipeClientStream,
                    IpcConfiguration.MessageHeader,
                    AckManager.GetAck(),
                    // 表示这是业务层的消息
                    IpcMessageCommandType.Business,
                    buffer,
                    offset,
                    count,
                    summary,
                    Logger
                );

                await NamedPipeClientStream.FlushAsync();
            }
        }
Beispiel #10
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);
            });
        }
Beispiel #11
0
        /// <summary>
        /// 创建文件写入方法
        /// </summary>
        /// <param name="stream"></param>
        public RandomFileWriterWithOrderFirst(FileStream stream)
        {
            Stream = stream;

            FileSegmentTaskList = new DoubleBufferTask <FileSegment>(WriteInner);
        }