代码之家  ›  专栏  ›  技术社区  ›  Nitheesh

有没有办法知道BlockingCollection中的所有任务何时完成执行?(任务将在启动时删除,但我想知道exec是否完成)[已关闭]

  •  0
  • Nitheesh  · 技术社区  · 7 年前

    我正在尝试创建一个单一消费者和多个生产者的模式。生产者将向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);
                    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Johan Donne    7 年前

    您可以在生产者本身中创建任务,并将其传递给“EnqueueTask”方法,而不是为“EnqueueTask”提供操作(并在方法中创建任务)。 通过这种方式,每个生产者可以维护其提交的任务列表,间歇性地查询每个任务的状态,并删除已完成的任务。

    推荐文章