// Handle end (continue) of task private static void TaskEnd(TaskContainer te, Task t) { if (te == null || t == null) { return; } // prepare task end event var taskEndEvent = new TaskEndEvent { AutoRestart = te.AutoRestart, Task = t, Name = te.Name }; // Fire end notification te.OnTaskEnd?.Invoke(te, new EventArgs <TaskEndEvent>(taskEndEvent)); // Check for auto restart if (taskEndEvent.AutoRestart) { //Avoid deadlock better way? Task.Run(() => te.ForceStart()).ConfigureAwait(false); } else // cleanup { //Avoid deadlock better way? Task.Run(() => te.Stop()).ConfigureAwait(false); } }
/// <summary> /// Create a new task container /// </summary> /// <param name="name">container/task name</param> /// <param name="spawner">the spawn function</param> /// <returns></returns> public static TaskContainer Create(string name, Func <CancellationToken, Task> spawner) { if (spawner == null) { throw new ArgumentNullException(nameof(spawner)); } var te = new TaskContainer { SpawnerFunc = spawner, Name = name }; return(te); }
private static void ReadKeys() { ConsoleKeyInfo key = new ConsoleKeyInfo(); while (!Console.KeyAvailable && key.Key != ConsoleKey.Escape) { key = Console.ReadKey(true); switch (key.Key) { case ConsoleKey.UpArrow: Console.WriteLine("UpArrow was pressed"); Counter c = new Counter(); TaskContainer.Create("tak", (tok) => AddCounterTask(tok, c)); break; case ConsoleKey.DownArrow: Console.WriteLine("DownArrow was pressed"); break; case ConsoleKey.RightArrow: Console.WriteLine("RightArrow was pressed"); break; case ConsoleKey.LeftArrow: Console.WriteLine("LeftArrow was pressed"); break; case ConsoleKey.Escape: break; default: if (Console.CapsLock && Console.NumberLock) { Console.WriteLine(key.KeyChar); } break; } } }