// a sample action for WorkerWithTaskScheduler constructor public static void ExecuteMainLoop(WorkerWithTaskScheduler <TResult> worker) { while (!worker.ContinueExecution) { worker.Token.ThrowIfCancellationRequested(); worker.ExecutePendingTasks(); } }
static async Task DoWorkAsync() { Console.WriteLine("Initial thread: " + Thread.CurrentThread.ManagedThreadId); // the worker thread lambda Func <WorkerWithTaskScheduler <int>, int> workAction = (worker) => { var result = 0; Console.WriteLine("Worker thread: " + Thread.CurrentThread.ManagedThreadId); while (worker.ContinueExecution) { // observe cancellation worker.Token.ThrowIfCancellationRequested(); // executed pending tasks scheduled with WorkerWithTaskScheduler.Run worker.ExecutePendingTasks(); // do the work item Thread.Sleep(200); // simulate work payload result++; Console.Write("\rDone so far: " + result); if (result > 100) { break; // done after 100 items } } return(result); }; try { // cancel in 30s var cts = new CancellationTokenSource(30000); // start the worker var worker = new WorkerWithTaskScheduler <int>(workAction, cts.Token); // pause upon Enter Console.WriteLine("\nPress Enter to pause..."); Console.ReadLine(); worker.WaitForPendingTasks = true; // resume upon Enter Console.WriteLine("\nPress Enter to resume..."); Console.ReadLine(); worker.WaitForPendingTasks = false; // send a "message", i.e. run a lambda inside the worker thread var response = await worker.Run(() => { // do something in the context of the worker thread return(Thread.CurrentThread.ManagedThreadId); }, cts.Token); Console.WriteLine("\nReply from Worker thread: " + response); // End upon Enter Console.WriteLine("\nPress Enter to stop..."); Console.ReadLine(); // worker.EndExecution() to get the result gracefully worker.ContinueExecution = false; // or worker.Cancel() to throw var result = await worker.WorkerTask; Console.Write("\nFinished, result: " + result); } catch (Exception ex) { while (ex is AggregateException) { ex = ex.InnerException; } Console.WriteLine(ex.Message); } }