Создание потоков в статических конструкторах

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

Что тут происходит?

using System;
using System.Threading;

static public class Test
{
    static public bool isDone = false;

    static Test()
    {
        Thread a = new Thread(TestThread);
        a.Priority = ThreadPriority.Highest;
        a.Start();

        while (!isDone)
            Thread.Sleep(1);

        Console.WriteLine(isDone);
    }

    static private void TestThread()
    {
        isDone = true;
    }
}

1 ответ

Решение

РЕДАКТИРОВАТЬ: я писал бессмысленно. Статические конструкторы выполняются под блокировкой, чтобы несколько потоков не могли инициализировать статический класс более одного раза. Однако вы пытаетесь получить доступ к своему классу из нескольких потоков до завершения этой инициализации, поэтому ваш код приводит к тупику. Смотрите объяснение здесь

Другие вопросы по тегам