private void InternalEnqueue(ExecutionThread task) { _empty.Reset(); Empty?.Invoke(false); _queuedTasks.Enqueue(task); PromoteTasks(); }
/// <summary> /// Создает и запускает новый поток. /// </summary> /// <param name="action">Код потока.</param> /// <param name="parameter">Параметр потока.</param> /// <returns>Объект ExecutionThread.</returns> public static ExecutionThread <T, R> StartNew <T, R>(Func <T, R> action, T parameter) where T : class { var p = new ExecutionThread <T, R>(action); p.Start(parameter); return(p); }
/// <summary> /// Ставит в очередь задачу. /// </summary> /// <param name="action">Метод задачи.</param> /// <returns>Объект ExecutionThread.</returns> public ExecutionThread Enqueue(Action action) { var task = new ExecutionThread(action, this); Synchronous(p => p.InternalEnqueue(task)); return(task); }
/// <summary> /// Создает и запускает новый поток. /// </summary> /// <param name="action">Код потока.</param> /// <param name="priority"></param> /// <returns>Объект ExecutionThread.</returns> public static ExecutionThread StartNew(Action action, ThreadPriority priority) { var p = new ExecutionThread(action) { Priority = priority }; p.Start(); return(p); }
/// <summary> /// Ставит в очередь задачу с входными и выходными данными. /// </summary> /// <typeparam name="T">Тип входных данных задачи.</typeparam> /// <typeparam name="R">Тип выходных данных задачи.</typeparam> /// <param name="action">Метод задачи.</param> /// <param name="parameter">Входные данные задачи.</param> /// <returns>Объект ExecutionThread.</returns> public ExecutionThread <T, R> Enqueue <T, R>(Func <T, R> action, T parameter) where T : class { var task = new ExecutionThread <T, R>(action, this) { Parameter = parameter }; Synchronous(p => p.InternalEnqueue(task)); return(task); }
private void InternalUnregister(ExecutionThread task) { _activeTasks.Remove(task); if (null != task.Error) { _errors.Add(task.Error); } PromoteTasks(); if (!_queuedTasks.Concat(_activeTasks).Any()) { _empty.Set(); Empty?.Invoke(true); } }
internal void Unregister(ExecutionThread task) { Synchronous(p => p.InternalUnregister(task)); }