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

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

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

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;
    }
}

person Thorham    schedule 28.12.2018    source источник
comment
Попробуйте сделать конструктор общедоступным.   -  person jdweng    schedule 28.12.2018
comment
Это работает, но не отвечает на вопрос и приводит к более сложному коду того, что я хочу сделать.   -  person Thorham    schedule 28.12.2018
comment
Код без Public использует встроенный конструктор, а не ваш конструктор. Так что он не выполняет ваш код.   -  person jdweng    schedule 28.12.2018
comment
@jdweng Это неправда. Статический конструктор запускается в первый раз и осуществляется доступ к члену статического класса.   -  person FCin    schedule 28.12.2018
comment
Не говоря уже о том, что статические конструкторы не могут иметь модификаторов доступа.   -  person Thorham    schedule 28.12.2018
comment
Тогда почему паблик работает?   -  person jdweng    schedule 28.12.2018
comment
Это не так. Статический конструктор не может быть общедоступным. Я пробовал это, хотя это не имеет смысла, потому что вы не можете вызвать статический конструктор.   -  person Thorham    schedule 28.12.2018


Ответы (1)


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

person Nick    schedule 28.12.2018
comment
Это по-прежнему не заставляет поток работать во время конструктора, как ни странно. - person Thorham; 28.12.2018
comment
Действительно, и я нашел причину, почему и отредактировал свой ответ соответствующим образом. - person Nick; 28.12.2018
comment
Теперь понятно, спасибо. - person Thorham; 28.12.2018