最近,我开始开发一个新的应用程序,它将利用任务并行性。我刚刚开始编写一个任务处理框架,但最近看到了许多关于新的System.Threading.Tasks名称空间的文章,这些文章对我来说可能很有用(我宁愿使用现有的框架,也不愿使用自己的框架)。
但是,看看MSDN,我还没有看到如何/如果,我可以实现我正在寻找的功能:
对其他任务的依赖关系( completing.
task对象中多次调用)的任务数量未知的任务,
有更高的优先级
有人能给我举个例子/告诉我如何做到这一点吗?干杯。
C#用例:(输入所以请提供任何语法错误/输入)
**注意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 ();
}
}
}发布于 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)
。
https://stackoverflow.com/questions/1998642
复制相似问题