首页 / C# / c# – 在其执行方法中访问Task实例
c# – 在其执行方法中访问Task实例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 在其执行方法中访问Task实例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2392字,纯文字阅读大概需要4分钟。
内容图文
![c# – 在其执行方法中访问Task实例](/upload/InfoBanner/zyjiaocheng/767/abf115f503884b19b6581eda0044fe04.jpg)
我想创建简单的无限循环,将作业提供给基于任务的作业池.
此外,我想限制当时最大创建的任务(我知道任务计数不必等于线程数).
我有的是这个:
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-> 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# – 在其执行方法中访问Task实例全部内容,希望文章能够帮你解决c# – 在其执行方法中访问Task实例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。