在其执行方法内访问Task实例

LightCZ

我想创建一个简单的无限循环,将工作馈送到基于任务的工作池中。我也想限制当时最多创建的任务(我知道任务数不必等于线程数)。

我所拥有的是:

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尚未完成。

也有人在这个问题内建议continueWith:任务不等待ContinueWith完成,但是创建新任务,我不是在等待那个,而是在等待原始任务。

我的问题是完成后如何从其动作(方法)内部的集合中删除任务。

例子:

让我们让MaxD​​egreeOfParallelism(Aka QueuTaskCount)= 2

因此,在第一个迭代中,我们将连续启动任务AB(这将A和B从列表中删除),将它们称为A'B'

所以在第一次迭代中


A- > A'

B- > B'

在那一行Task.WaitAny()行中,我们等待任务

AB


可以说A结束,B继续

因此,我们再次进行迭代,因为Task.WaitAny满载,并且我们继续进行下一个迭代


当计数时,我们现在应该创建多少个任务,我们就在这一行上执行targetCount = QueueTaskCount-m_runningTasks.Count;。

正如我们所说的A结束(又名runtocomplettiion)B奔跑

但是在集合(m_runningTasks)中,我们可能还是可能没有

AB或仅B-取决于任务A'(它将A从集合中删除)

这是问题所在。在这种情况下,我不知道集合的状态是什么-但正确的状态只是B,因为A结束了。

LightCZ

有人(不记得知道谁了,删除了建议书)建议这不是我应该采取的最佳做法。

您必须从外部解决此问题-任务的调用者或创建者负责处理该问题。一种解决方案是利用Task.WhenAny()并删除内部while循环内的已完成任务(一次),但这可读性也不强。

我使用了带有MaxDegreeOfParallelism的ActionBlock并在其内部动作中填充任务的方式解决了这个问题-如此处所示:实现永无止境的任务的正确方法。(计时器与任务)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在其实例上访问es-2015类方法?

来自分类Dev

尝试访问我在其上调用类方法的类的实例变量

来自分类Dev

在其方法中获取单例实例

来自分类Dev

Kivy-在其他屏幕中创建的访问实例

来自分类Dev

从类方法访问实例方法

来自分类Dev

有没有一种方法可以执行对结构实例的索引访问?

来自分类Dev

对象实例的方法不执行

来自分类Dev

ruby / rails:如何访问在关联上调用的类方法内的实例

来自分类Dev

ruby / rails:如何访问在关联上调用的类方法内的实例

来自分类Dev

无法在类实例内访问变量

来自分类Dev

在其他范围内执行角度服务?

来自分类Dev

从类方法proc访问实例方法

来自分类Dev

在实例方法中访问类方法可变

来自分类Dev

在类的实例上执行类方法的列表

来自分类Dev

从类的所有实例执行方法

来自分类Dev

Sprite Kit碰撞-在发生碰撞的实例上执行实例方法

来自分类Dev

访问main()方法中的实例变量?

来自分类Dev

Ruby:使用哈希访问实例方法

来自分类Dev

如何访问React组件实例的方法?

来自分类Dev

Java-实例能够访问静态方法

来自分类Dev

使实例方法无法从子类访问

来自分类Dev

从Typescript中的实例访问静态方法

来自分类Dev

访问父控制器的实例方法

来自分类Dev

无法从静态方法dart访问实例成员

来自分类Dev

如何动态访问Ruby实例变量/方法?

来自分类Dev

Ruby:使用哈希访问实例方法

来自分类Dev

从目标C中的方法访问实例变量

来自分类Dev

无法访问 Sequelize 实例方法

来自分类Dev

如何从 Ruby 中的实例方法访问模块?