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
        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 #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);
            });
        }