有什么方法可以知道 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' 方法。 通过这种方式,每个生产者都可以维护它已提交的任务列表,间歇性地查询每个任务的状态并删除已完成的任务。

这有一个额外的好处,即生产者可以取消它已提交的任务(甚至在它们启动之前)或检测由于异常而中止的任务。