private object DoLockedProcess(ProcessAction action) { object result = null; lock (locker) { bool isSended = false; Thread clientThread = new Thread(new ThreadStart(() => { result = action.Invoke(); isSended = true; })); clientThread.Start(); int counter = 0; while (counter * 100 <= delay) { Thread.Sleep(100); counter++; if (isSended) { break; } } if (!isSended) { clientThread.Abort(); } } return(result); }
/// <summary> /// The main engine which executes as an infinite loop until it is cancelled or /// the queue becomes empty /// </summary> public void Dequeue() { while (true) { if (CancelToken.IsCancellationRequested) { CancelToken.ThrowIfCancellationRequested(); } var tasks = CollectActions(); if (tasks.Count > 0) { ProcessAction?.Invoke(new QueueServiceEventArgs( tasks.Count, EQueueServiceState.BeforeExecute)); if (CancelToken.IsCancellationRequested) { CancelToken.ThrowIfCancellationRequested(); } Parallel.ForEach(tasks, task => task.ActionMethod()); ProcessAction?.Invoke(new QueueServiceEventArgs(tasks.Count, EQueueServiceState.CompletedExecute)); } else if (MarkCompleted && _queue.Count <= 0) { break; } } }
public void Dequeue() { while (true) { var tasks = new List <QueueAction>(); for (int i = 0; i < maxParallelTasks; ++i) { if (_queue.TryDequeue(out QueueAction action)) { tasks.Add(action); } } if (tasks.Count > 0) { ProcessAction?.Invoke(new ProcessActionEventArgs( tasks.Count, true)); Parallel.ForEach(tasks, task => task.ActionMethod()); ProcessAction?.Invoke(new ProcessActionEventArgs(tasks.Count, false)); } else if (Completed && _queue.Count <= 0) { break; } } }
/// <summary> /// Add new task to the queue /// </summary> /// <param name="action"></param> public void Enqueue(Action action) { _queue.Enqueue(new QueueAction() { ActionMethod = action, Id = _queue.Count }); ProcessAction?.Invoke(new QueueServiceEventArgs( _queue.Count, EQueueServiceState.Enqueue)); }