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(); }); }
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); }
public void OnCompleted(Action continuation) => m_ioServiceScheduler.Post(continuation);