2010-01-04 53 views
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(); 
     } 
    } 
} 

回答

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(任务[]任务)
  • 调度:库支持限制使用的线程数量众多的选项,并支持提供自己的调度。如果可能的话,我会避免改变线程的优先级。这可能会对计划程序产生负面影响,除非您提供自己的计划。