有什么方法可以知道 BlockingCollection 中的所有任务何时完成执行?(任务将在启动时被删除,但我想知道 exec 是否完成)
Any way to know when all the Tasks in BlockingCollection finished execution?(Task will get deleted when started but I want to knowif exec is complete)
我正在尝试创建单一消费者和多个生产者模式。生产者将任务添加到 BlockingCollection,消费者将 运行 任务。我想知道是否有办法知道消费者产生的所有任务的执行是否完成。
public TaskQueue(IProducerConsumerCollection<Task> workTaskCollection)
{
_workTaskQueue = new BlockingCollection<Task>(workTaskCollection);
}
public void EnqueueTask(Action action, CancellationToken cancelToken = default(CancellationToken))
{
var task = new Task(action, cancelToken);
if (_workTaskQueue.TryAdd(task))
{
TaskHandler?.Invoke
(new TaskProcessingArguments
{
ISTaskAdded = true,
Message = "Task Added to Queue",
PendingTaskCount = _workTaskQueue.Count,
});
}
else
{
TaskHandler?.Invoke
(new TaskProcessingArguments
{
ISTaskAdded = false,
Message = "Timedout while adding Task to Queue",
PendingTaskCount = _workTaskQueue.Count,
});
}
}
public void DequeueTask()
{
foreach (var task in _workTaskQueue.GetConsumingEnumerable())
try
{
if (!(task.IsCanceled) && task.Status == TaskStatus.Created)
{
task.Start();
}
}
catch (Exception ex)
{
}
}
public static void Run()
{
Task.Factory.StartNew(() =>
{
taskQueue.DequeueTask();
}, TaskCreationOptions.LongRunning);
}
无需为 'EnqueueTask' 提供 Action(并在方法中创建任务),您可以在生产者本身中创建任务,并将其传递给 'EnqueueTask' 方法。
通过这种方式,每个生产者都可以维护它已提交的任务列表,间歇性地查询每个任务的状态并删除已完成的任务。
这有一个额外的好处,即生产者可以取消它已提交的任务(甚至在它们启动之前)或检测由于异常而中止的任务。
我正在尝试创建单一消费者和多个生产者模式。生产者将任务添加到 BlockingCollection,消费者将 运行 任务。我想知道是否有办法知道消费者产生的所有任务的执行是否完成。
public TaskQueue(IProducerConsumerCollection<Task> workTaskCollection)
{
_workTaskQueue = new BlockingCollection<Task>(workTaskCollection);
}
public void EnqueueTask(Action action, CancellationToken cancelToken = default(CancellationToken))
{
var task = new Task(action, cancelToken);
if (_workTaskQueue.TryAdd(task))
{
TaskHandler?.Invoke
(new TaskProcessingArguments
{
ISTaskAdded = true,
Message = "Task Added to Queue",
PendingTaskCount = _workTaskQueue.Count,
});
}
else
{
TaskHandler?.Invoke
(new TaskProcessingArguments
{
ISTaskAdded = false,
Message = "Timedout while adding Task to Queue",
PendingTaskCount = _workTaskQueue.Count,
});
}
}
public void DequeueTask()
{
foreach (var task in _workTaskQueue.GetConsumingEnumerable())
try
{
if (!(task.IsCanceled) && task.Status == TaskStatus.Created)
{
task.Start();
}
}
catch (Exception ex)
{
}
}
public static void Run()
{
Task.Factory.StartNew(() =>
{
taskQueue.DequeueTask();
}, TaskCreationOptions.LongRunning);
}
无需为 'EnqueueTask' 提供 Action(并在方法中创建任务),您可以在生产者本身中创建任务,并将其传递给 'EnqueueTask' 方法。 通过这种方式,每个生产者都可以维护它已提交的任务列表,间歇性地查询每个任务的状态并删除已完成的任务。
这有一个额外的好处,即生产者可以取消它已提交的任务(甚至在它们启动之前)或检测由于异常而中止的任务。