3
我最近开始研究一个将利用任务并行性的新应用程序。我刚刚开始编写任务框架,但最近在SO上看到了许多关于新的System.Threading.Tasks命名空间的帖子,这对我可能是有用的(我宁愿使用现有的框架而不是自己的)。.NET 4.0线程。任务
但是看在MSDN我怎么没见过/如果我能实现我要找的功能:
- 依赖于完成其他任务。
- 能等待一个未知的数字预成型相同的动作任务(也许裹在被调用同一
task
对象多次) - 设置最大并发任务的情况下,因为他们使用一个共享的资源没有点运行多个一次
- 暗示的优先级,或调度宿任务,以更高的优先级较低的最大并发实例(以保持所述资源在使用中尽可能地)改变
- 编辑能力正在执行相同操作的任务的优先级(很差的例子,但PredictWeather(Tommorrow)将具有更高的p比PredictWeather(NextWeek)的暴躁)
有人可以指向一个例子/告诉我我怎么能做到这一点?干杯。
C#使用案例:(键入SO所以请为给出任何语法错误/错别字)
**注意Do()
/DoAfter()
不应该阻止调用线程*
class Application()
{
Task LeafTask = new Task (LeafWork) {PriorityHint = High, MaxConcurrent = 1};
var Tree = new TaskTree (LeafTask);
Task TraverseTask = new Task (Tree.Traverse);
Task WorkTask = new Task (MoreWork);
Task RunTask = new Task (Run);
Object SharedLeafWorkObject = new Object();
void Entry()
{
RunTask.Do();
RunTask.Join(); // Use this thread for task processing until all invocations of RunTask are complete
}
void Run(){
TraverseTask.Do();
// Wait for TraverseTask to make sure all leaf tasks are invoked before waiting on them
WorkTask.DoAfter (new [] {TraverseTask, LeafTask});
if (running){
RunTask.DoAfter (WorkTask); // Keep at least one RunTask alive to prevent Join from 'unblocking'
}
else
{
TraverseTask.Join();
WorkTask.Join();
}
}
void LeafWork (Object leaf){
lock (SharedLeafWorkObject) // Fake a shared resource
{
Thread.Sleep (200); // 'work'
}
}
void MoreWork()
{
Thread.Sleep (2000); // this one takes a while
}
}
class TaskTreeNode<TItem>
{
Task LeafTask; // = Application::LeafTask
TItem Item;
void Traverse()
{
if (isLeaf)
{
// LeafTask set in C-Tor or elsewhere
LeafTask.Do(this.Item);
//Edit
//LeafTask.Do(this.Item, this.Depth); // Deeper items get higher priority
return;
}
foreach (var child in this.children)
{
child.Traverse();
}
}
}