如何检测循环中的任务

Fer*_*own 5 .net c# 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码示例中,我设置了三个任务“a”、“b”、“c”,其中“a”等待“b”等待“c”等待“a”。

显然,WaitAll 然后返回 false,因为不可能完成所有任务。

我的问题是 - 有没有办法使用任务并行库来检测任务在循环中等待的情况,最好是禁止它?

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

小智 1

您需要研究有向图强连通分量

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

或者你可以使用像Quickgraph这样的库来处理这个问题。