首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET 4.0 Threading.Tasks

.NET 4.0 Threading.Tasks
EN

Stack Overflow用户
提问于 2010-01-04 10:20:39
回答 1查看 2.7K关注 0票数 3

最近,我开始开发一个新的应用程序,它将利用任务并行性。我刚刚开始编写一个任务处理框架,但最近看到了许多关于新的System.Threading.Tasks名称空间的文章,这些文章对我来说可能很有用(我宁愿使用现有的框架,也不愿使用自己的框架)。

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

对其他任务的依赖关系( completing.

  • Able )等待预先形成相同操作(可能包装在同一个task对象中多次调用)的任务数量未知的任务,

  • 设置任务的最大并发实例,因为它们使用共享资源--没有必要同时运行多个任务--

  • 提示优先级,或者调度程序将最大并发实例的最高优先级降低到更高的优先级(以便保持所述资源的使用与possible)

  • Edit能力一样多,以改变预先形成相同操作的任务的优先级(很糟糕的例子,但是,PredictWeather (明天)将比PredictWeather (NextWeek)

有更高的优先级

有人能给我举个例子/告诉我如何做到这一点吗?干杯。

C#用例:(输入所以请提供任何语法错误/输入)

**注意Do() / DoAfter()不应阻塞调用线程*

代码语言:javascript
复制
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 (); 
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-01-05 02:11:37

这里有许多例子:

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

这里有一份很好的白皮书,涵盖了你上面提到的很多细节:

并行编程模式:理解和应用.NET框架4的并行模式

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

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

tasks)

  • Scheduler:库支持限制正在使用的线程数量的许多选项,并支持提供您自己的调度程序。如果可能的话,我将避免更改线程的优先级。这可能会对调度程序产生负面影响,除非您提供自己的.

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1998642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档