ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 在其执行方法中访问Task实例

2019-07-11 13:05:37  阅读:115  来源: 互联网

标签:c scheduled-tasks task-parallel-library scheduling


我想创建简单的无限循环,将作业提供给基于任务的作业池.
此外,我想限制当时最大创建的任务(我知道任务计数不必等于线程数).

我有的是这个:

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没有完成.

还有人建议继续在这个问题中:
Task does not wait for ContinueWith to finish,但这创造了新的任务,我不是在等待,而是为了原始.

我的问题是如何在完成后从其操作(方法)中删除集合中的任务.

例:

让我们有MaxDegreeOfParallelism(Aka QueuTaskCount)= 2

因此,在第一次迭代中,我们将使用continuation(从列表中删除A和B)启动任务A和B,然后将它们称为A’和B’.

所以在第一次迭代中我们有

A->一种”

B-&GT B”

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

A&乙

让我们说A结束和B继续

所以我们再次迭代,因为Task.WaitAny是完整的,我们继续下一次迭代

当我们计算时,我们应该创建多少任务,现在我们就在这一行上做了
targetCount = QueueTaskCount – m_runningTasks.Count;

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

但是在集合(m_runningTasks)中,我们仍然可能会或可能不会

A& B或仅B – 取决于任务A'(从集合中删除A)

这是问题所在.
在这个itteration我不知道什么是集合的状态 – 但正确的状态只是B因为A结束.

解决方法:

好吧,有人(不记得知道谁,删除答案提案)建议这不是我应该去的最佳做法.

你必须从外面解决这个问题 – 任务的调用者或创建者负责处理它.
一个解决方案是利用Task.WhenAny()并删除内部while循环中的完成任务(当时一个),但这不是太可读也不是代码很好.

我解决了使用ActionBlock和MaxDegreeOfParallelism并在其内部动作中提供任务的问题 – 如下所示:
Proper way to implement a never ending task. (Timers vs Task)

标签:c,scheduled-tasks,task-parallel-library,scheduling
来源: https://codeday.me/bug/20190711/1432575.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有