.NET 4.0 Threading.Tasks

时间:2010-01-04 10:20:39

标签: .net-4.0 parallel-processing scheduled-tasks

我最近开始研究一种利用任务并行性的新应用程序。我刚刚开始编写任务框架,但是最近在SO上发布了一些关于新的System.Threading.Tasks命名空间的帖子,这对我来说可能是有用的(我宁愿使用现有的框架而不是自己的框架)。 / p>

然而,查看MSDN我还没有看到如何/如果,我可以实现我正在寻找的功能:

  • 完成其他任务的依赖。
  • 能够等待执行相同操作的未知数量的任务(可能包含在多次调用的同一task对象中)
  • 设置任务的最大并发实例,因为它们使用共享资源,一次运行不多于一个
  • 提示优先级,或者调度程序以较高优先级放置具有较低最大并发实例的任务(以便尽可能地保持所述资源的使用)
  • 编辑能够改变执行相同操作的任务的优先级(相当糟糕的例子,但PredictWeather(Tommorrow)将具有比PredictWeather(NextWeek)更高的优先级)

有人能指出我的例子/告诉我如何实现这一目标吗?欢呼声。

C#使用案例(在SO中输入,请提供任何语法错误/拼写错误)

** note 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 (); 
        }
    }
}

1 个答案:

答案 0 :(得分:4)

这里有很多例子:

http://code.msdn.microsoft.com/ParExtSamples

有一篇很好的白皮书,其中涵盖了您在上面提到的许多细节:

“并行编程模式:使用.NET Framework 4理解和应用并行模式”

http://www.microsoft.com/downloads/details.aspx?FamilyID=86b3d32b-ad26-4bb8-a3ae-c1637026c3ee&displaylang=en

我认为你可以做你在问题中列出的所有事情。

  • 依赖关系等:Task.WaitAll(Task []任务)
  • 调度程序:该库支持许多用于限制正在使用的线程数的选项,并支持提供自己的调度程序。如果可能的话,我会避免改变线程的优先级。这可能会对调度程序产生负面影响,除非您提供自己的调度程序。