如何检测循环中的任务

时间:2015-04-07 15:43:53

标签: c# .net task-parallel-library

class Program
{
    private static Task[] tasks;

    static void Main(string[] args)
    {
        tasks = new Task[]
        {
            new Task(() => Task.WaitAll(tasks[1])),
            new Task(() => Task.WaitAll(tasks[2])),
            new Task(() => Task.WaitAll(tasks[0])),
        };

        tasks[0].Start();
        tasks[1].Start();
        tasks[2].Start();

        Console.WriteLine(Task.WaitAll(tasks, 5000));
        Console.ReadLine();
    }
}

在上面的代码示例中,我设置了三个任务" a"," b"," c"在哪里" a"等待" b"等待" c"等待" a"。

显然,WaitAll会返回false,因为所有任务都无法完成。

我的问题是 - 有没有办法,使用任务并行库,检测任务在一个周期中等待的情况,最好是不允许它?

(这是为了让我们通过重用现有任务来检测循环区域)

1 个答案:

答案 0 :(得分:0)

您需要查看directed graphsstrongly connected component

您可以在实例化它们时构建任务图表,然后计算强连接组件。为此,您可以使用Tarjan's algorithmhere是C#中的实现。

或者您可以使用像Quickgraph这样处理它的库。