У меня класс ClassA

public class ClassA
{
    public ClassA()
    {
        Thread t = new Thread(EndlessLoop);
        t.IsBackground = True;
        t.Start();
    }

    private void EndlessLoop()
    {
        while (True)
        {
    // do something 
        }
    }
}

И я не уверен, что поток будет удален, если я установлю для объекта ClassA значение null

ClassA a = new ClassA();

# will the thread exit ?
a = null;

Или, может быть, мне стоит реализовать IDisposable и вызвать его вручную?

3
kedpter 6 Дек 2019 в 03:59
Я бы добавил логическую переменную shouldRun и установил для нее значение true. Реализуйте IDisposable и в методе dispose установите для shouldRun значение false, чтобы EndlessLoop мог выйти.
 – 
Ken Tucker
6 Дек 2019 в 04:07

2 ответа

С потоком ОС ничего не произойдет, если вы удалите последнюю ссылку на соответствующий ему объект Thread - Время жизни объекта потока C #. Поток будет продолжать выполнять код до тех пор, пока метод не завершится (маловероятно в показанном случае while(true)), поток завершится с помощью Abort (не делайте этого - Что не так с использованием Thread.Abort ()) или процесс завершается.

Единственный хороший вариант - каким-то образом уведомить код потока о том, что он должен завершиться (т. Е. Используя события или даже глобальную переменную, защищенную lock). Также подумайте, может ли использование Task и async с соответствующим механизмом отмены упростить код (это не решит проблему с бесконечным циклом, но даст хорошую основу для написания отменяемых операций).

Обратите внимание, что вы не можете «удалить» поток, потому что он не реализует Dispose (Нужно ли нам удалять или завершать поток в C # после использования?),

4
Alexei Levenkov 6 Дек 2019 в 04:10

После запуска поток завершится после того, как процедура подойдет к концу (или будет вызван Thread.Abort, или программа завершится). Класс Thread не реализует IDisposable, поэтому нет метода Dispose для вызова. Чтобы завершить длительный поток, вы можете установить флаг, который поток периодически проверяет.

Объект Thread может быть обработан сборщиком мусора, когда он выходит за пределы области видимости и больше не упоминается. Однако созданный поток продолжит работу.

3
IronMan 6 Дек 2019 в 04:09