/// <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); }
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(); }
private async Task QueueWriteAsync(Func <Ack, Task> task) { await DoubleBufferTask.AddTaskAsync(async() => { await AckManager.DoWillReceivedAck(task, PeerName, TimeSpan.FromSeconds(3), maxRetryCount: 10); }); }
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; }
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 void SetConfiguration(FileLoggerConfiguration configuration) { if (FileLoggerConfiguration != null) { throw new InvalidOperationException($"重复多次设置日志文件"); } FileLoggerConfiguration = configuration.Clone(); DoubleBufferTask.OnInitialized(); IsInitialized = true; }
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(); }
/// <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(); } }
/// <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(); } }
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); }); }
/// <summary> /// 创建文件写入方法 /// </summary> /// <param name="stream"></param> public RandomFileWriterWithOrderFirst(FileStream stream) { Stream = stream; FileSegmentTaskList = new DoubleBufferTask <FileSegment>(WriteInner); }