我有以下简单的代码:
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
可以正常使用。
答案 0 :(得分:11)
在Program
的静态初始化程序中,您正在启动一个新线程,并让它在类上调用一个方法,您当前正在为运行静态初始化程序。 C#将确保一个类只被初始化一次,所以如果两个线程尝试初始化一个类,那么一个将等待另一个完成。由于初始化程序在可以继续之前等待x
完成,并且x
正在等待初始化程序在它可以运行之前完成,因此您有一个死锁。