private void addCoroutineMethods()
        {
            const int NUMBER_OF_COROUTINES = 30;
            const int NUMBER_OF_ITERATIONS = 40;

            var tasksArray = Enumerable.Range(0, NUMBER_OF_COROUTINES)
                             .Select(i => m_scheduler.Post(() =>
                                                           new LogCoroutineMethod(NUMBER_OF_ITERATIONS, i.ToString(CultureInfo.InvariantCulture))
                                                           .Start(m_coroutine)))
                             .ToArray();

            m_scheduler.Post(async() =>
            {
                await Task.WhenAll(tasksArray);
                Console.WriteLine("All coroutines finished!");
                m_work.Dispose();
            });
        }
Exemple #2
0
        public async Task Run_When_Called_From_Multiple_Threads_Then_All_Tasks_Executed()
        {
            const int NUMBER_OF_SCHEDULED_TASKS = 100;
            const int DEFAULT_TASK_SLEEP        = 100;
            const int NUMBER_OF_WORKER_THREAD   = 3;
            var       countDownEvent            = new CountdownEvent(NUMBER_OF_WORKER_THREAD);

            var executedTasks = 0;

            var allTasks = Enumerable.Range(0, NUMBER_OF_SCHEDULED_TASKS).Select(_ => m_scheduler.Post(() => Thread.Sleep(DEFAULT_TASK_SLEEP))).ToArray();

            Enumerable.Range(0, NUMBER_OF_WORKER_THREAD).Select(_ => ThreadPool.QueueUserWorkItem(__ =>
            {
                var tasksExecutedInThisThread = m_scheduler.Run();
                Interlocked.Add(ref executedTasks, tasksExecutedInThisThread);
                countDownEvent.Signal();
            })).ToArray();

            await Task.WhenAll(allTasks);

            countDownEvent.Wait();

            Assert.AreEqual(NUMBER_OF_SCHEDULED_TASKS, executedTasks);
        }
Exemple #3
0
 public void OnCompleted(Action continuation) => m_ioServiceScheduler.Post(continuation);