为什么Task.WhenAll()阻止在这里?

der*_*khh 3 c# async-await

我有一个相当简单的代码片段,但它似乎阻止Task.WhenAll().Main函数只是调用new Test().有人可以帮助找到根本原因吗?

internal class Test
{
    public static async Task<int> Foo()
    {
        return 0;
    }

    static Test()
    {
        var taskList = new List<Task>();

        for (int i = 0; i < 100; i++)
            taskList.Add(Task.Run(() => Foo()));

        Task.WhenAll(taskList.ToArray()).GetAwaiter().GetResult();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*ray 9

运行静态构造函数时,CLR采用全局锁定.静态构造函数必须在其他线程可以在类上输入任何方法之前释放此锁.这是为了保证静态构造函数的运行,并且每个appdomain只完成一次.以下是线程更明确的问题.

class Test
{
    static Test() {
       var thread = new Thread(ThreadMethod);
       thread.Start();
       thread.Join();
    }

    private static void ThreadMethod()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

ThreadMethod在静态构造函数退出之前,新线程无法进入,但静态构造函数无法退出,直到线程结束,即死锁.

你的例子只是一个更复杂的版本,它使用Task.Run而不是创建Thread和启动它,然后GetResult阻止相同的方式Thread.Join.