c# – 在其执行方法中访问Task实例
我想创建简单的无限循环,将作业提供给基于任务的作业池.
此外,我想限制当时最大创建的任务(我知道任务计数不必等于线程数). 我有的是这个: private readonly HashSet<Task> m_runningTasks = new HashSet<Task>(); private const int QueueTaskCount = 10; //our target task count .... some method here .... while (m_run){ IList<Job> jobs = null; lock(m_runningTasks){ //determine missing job count here targetCount = QueueTaskCount - m_runningTasks.Count; if(targetCount>0) jobs = GetSomeWork(targetCount); } if(jobs != null && jobs.Count > 0){ //i want to create jobs here in tasks foreach(var job in jobs){ var task = new Task(job.Execute); lock(m_runningTasks) m_runningTasks.Add(task); //i could add continueTask instead of task here but that does not solve the problem var continueTask = task.ContinueWith(x=> {lock(m_runningTasks){ m_runningTasks.Remove(x); } };) task.Run(); } Task[] taskArray; lock(m_runningTasks) taskArray = m_runningTasks.ToArray() Task.WaitAny(taskArray).Wait(); //HERE is the problem } } 我知道当我创建continueWith它的新任务但我需要阻止当前线程(创建和执行任务),直到m_running集合中的一些任务完成.但是当我等待主要任务时,他们无法从收集中删除(m_runningTasks),因为continueTask没有完成. 还有人建议继续在这个问题中: 我的问题是如何在完成后从其操作(方法)中删除集合中的任务. 例: 让我们有MaxDegreeOfParallelism(Aka QueuTaskCount)= 2 因此,在第一次迭代中,我们将使用continuation(从列表中删除A和B)启动任务A和B,然后将它们称为A’和B’. 所以在第一次迭代中我们有 A->一种” B-> B” 在那行Task.WaitAny()行中我们等待任务 A&乙 让我们说A结束和B继续 所以我们再次迭代,因为Task.WaitAny是完整的,我们继续下一次迭代 当我们计算时,我们应该创建多少任务,现在我们就在这一行上做了 正如我们所说 但是在集合(m_runningTasks)中,我们仍然可能会或可能不会 A& B或仅B – 取决于任务A'(从集合中删除A) 这是问题所在. 解决方法
好吧,有人(不记得知道谁,删除答案提案)建议这不是我应该去的最佳做法.
你必须从外面解决这个问题 – 任务的调用者或创建者负责处理它. 我解决了使用ActionBlock和MaxDegreeOfParallelism并在其内部动作中提供任务的问题 – 如下所示: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |