2017-01-03 7 views
4

У меня есть следующий простой код:Task.Wait() никогда не возвращается при вызове во время инициализации статического поля?

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() никогда не завершает/возврат и вешает навсегда. Может ли кто-нибудь объяснить это странное поведение?

Не похоже, что есть блокирующие вызовы для пользовательского интерфейса, все, что я могу догадаться, это то, что threadpool как-то максимизирован?

Если я удаляю звонок .Wait(), то x() в конце концов будет введен.

Обратите внимание, что вызов BuildList() от Main работает отлично.

+1

Информация о Needz moar – Liam

+4

Это, безусловно, не то, что вы на самом деле делаете, если это то, что вы видите. Вам нужно предоставить пример, который действительно способен воспроизвести вашу проблему. Кроме того, вы никогда не должны использовать конструктор 'Task', когда-либо. Используйте «Task.Run», если вы хотите запустить новую «Задачу», которая представляет выполнение работы в потоке пула потоков. – Servy

+1

«Это не похоже на блокировку вызовов UI» ... 't.Wait'_is_ блокирует ваш основной поток. И 't.Start()' только назначает задачу, но для этого не использует другой поток. –

ответ

11

Внутри статического инициализатора для Program вы начинаете новый поток и вызываете метод в классе , что в настоящее время вы запускаете статический инициализатор для. C# гарантирует, что класс инициализируется ровно один раз, поэтому, если два потока попытаются инициализировать класс, тогда один будет ждать завершения другого. Поскольку инициализатор ожидает завершения x, прежде чем он сможет продолжить, а x ожидает завершения инициализатора до его запуска, у вас есть тупик.

+0

Тонкий, но удивительный. Мне нравится объяснение. Что-то вспомнить. –