在静态字段初始化期间调用时,Task.Wait()永远不会返回?

时间:2017-01-03 16:44:27

标签: c# task

我有以下简单的代码:

    class Program
    {
        public static readonly List<int> Years = BuildList();

        static void Main(string[] args) { }

        private static List<int> BuildList()
        {
            var t = Task.Run(() => x());
            t.Wait();
            return new List<int>();
        }

        private static void x()
        {
            Console.WriteLine("Hello World");
        }
    }

调试后,永远不会输入x()t.Wait()永远不会完成/返回并永久挂起。任何人都可以解释这种奇怪的行为吗?

它不像有任何UI阻塞调用,我能猜到的是线程池以某种方式被最大化了吗?

如果我删除了.Wait()来电,那么最终会输入x()

请注意,从BuildList()调用Main可以正常使用。

1 个答案:

答案 0 :(得分:11)

Program的静态初始化程序中,您正在启动一个新线程,并让它在类上调用一个方法,您当前正在为运行静态初始化程序。 C#将确保一个类只被初始化一次,所以如果两个线程尝试初始化一个类,那么一个将等待另一个完成。由于初始化程序在可以继续之前等待x完成,并且x正在等待初始化程序在它可以运行之前完成,因此您有一个死锁。