public async Task TestToMainContext() { await AsTask.ToMainContext(); Console.WriteLine(AsTask.WhereAmI()); Assert.True(AsTask.IsMainContext(), "This is not the MainContext!"); }
public async Task TestAwaitPost() { await AsTask.ToMainContext(); var stopwatch = Stopwatch.StartNew(); await AsTask.ToBackgroundContext(() => Thread.Sleep(1000)); stopwatch.Stop(); Console.WriteLine($"{nameof(stopwatch)} {stopwatch.ElapsedMilliseconds}ms == {AsTask.GetCurrentContextType()} awaiter 1000ms"); Assert.True(stopwatch.ElapsedMilliseconds >= 1000); }
public async Task TestDelayAwaiterMainContext() { await AsTask.ToMainContext(); var stopwatch = Stopwatch.StartNew(); await Task.Delay(100); stopwatch.Stop(); Assert.True(AsTask.IsMainContext(), $"This is not the MainContext: {AsTask.WhereAmI()}"); Console.WriteLine($"{nameof(stopwatch)} {stopwatch.ElapsedMilliseconds}ms == {AsTask.GetCurrentContextType()} awaiter 100ms"); Assert.True(stopwatch.ElapsedMilliseconds >= 80 && stopwatch.ElapsedMilliseconds <= 150); }
public async Task TestExceptions1() { for (var i = 0; i < 5; i++) { try { await Exceptions(i); } catch (Exception) { Console.WriteLine($"Catch exception[{i}]"); } } async Task Exceptions(int idx) { switch (idx) { case 0: await AsTask.ToMainContext(); throw new ApplicationException("ToMainContext"); case 1: await AsTask.ToBackgroundContext(); throw new ApplicationException("ToBackgroundContext"); case 2: await AsTask.ToContext(_contextTests2Id); throw new ApplicationException("ToContext"); case 3: await AsTask.ToStaticThreadPool(); throw new ApplicationException("ToStaticThreadPool"); case 4: await AsTask.ToDynamicThreadPool(); throw new ApplicationException("ToDynamicThreadPool"); } } }
public async Task TestMoreSwitching() { for (var i = 0; i < 1000; i++) { await TestSwitchingToContexts(); } for (var i = 0; i < 1000; i++) { await AsTask.ToMainContext(); Assert.True(AsTask.IsMainContext()); } for (var i = 0; i < 1000; i++) { await AsTask.ToBackgroundContext(); Assert.True(AsTask.IsBackgroundContext()); } for (var i = 0; i < 1000; i++) { await AsTask.ToContext(_contextTests1Id); Assert.True(AsTask.IsThreadContext(_contextTests1Id)); } for (var i = 0; i < 1000; i++) { await AsTask.ToStaticThreadPool(); Assert.True(AsTask.IsStaticThreadPool()); } for (var i = 0; i < 1000; i++) { await AsTask.ToDynamicThreadPool(); Assert.True(AsTask.IsDynamicThreadPool()); } }
private static async Task Main() { WriteLine("Assign an exception handler."); TaskExceptionHandler.SetExceptionHandler(task => { Error.WriteLine(task.Exception != null ? $"[ExceptionHandler] {task.Exception.GetBaseException().Message}" : $"[ExceptionHandler] Unhandled exception in task {task}"); }); WriteLine("We get or create a synchronization context and switch to it."); await AsTask.Initialize(); WriteLine($"Print to the console information about the current context: {AsTask.WhereAmI()}"); WriteLine("Switch to the background context."); await AsTask.ToBackgroundContext(); WriteLine($"Now we get information about the context of the background context: {AsTask.WhereAmI()}"); WriteLine("Back switch to the main context."); await AsTask.ToMainContext(); WriteLine("We call the asynchronous methods, which performs the heavy work..."); var tasks = new List <Task <long> >(); for (var i = 1; i <= 10; i++) { tasks.Add(FindPrimeNumberAsync(20000 * i)); } WriteLine("Asynchronously waiting for the execution of tasks."); _ = Task.WhenAll(tasks).ContinueWith(async task => { await AsTask.ToMainContext(); WriteLine("This is the result of our calculations:"); foreach (var val in task.Result) { WriteLine(val); } Shutdown(); }).ExceptionHandler(); if (AsTask.IsMainContext()) { WriteLine("hmm, we're still in the main context!:)"); } WriteLine("The life cycle of a console application runs on the main context."); var scheduler = AsTask.GetStaticTaskScheduler(); while (!_isShutdown) { WriteLine($"Count running tasks: {scheduler.CountExecutableTasks}; Count tasks in queue: {scheduler.CountTasksInQueue}"); await Task.Delay(1000); // Each iteration waits asynchronously for 1000 ms } WriteLine("Shutdown..."); for (var i = 5; i > 0; i--) { WriteLine($"Shutdown through {i}s"); await Task.Delay(1000); } }