C #: правильно освобождая поток - PullRequest
2 голосов
/ 08 мая 2009

У меня есть абстрактный класс, который порождает бесконечный цикл в своем конструкторе. Каков наилучший способ убедиться, что этот поток прерывается, когда класс используется?

Должен ли я реализовать IDisposable и просто использовать это?

public void Dispose()
{
    this.myThread.Abort();
}

Я читал, что Abort () - это зло. Должен ли я вместо этого Dispose () установить частный флаг bool, который поток проверяет на true, чтобы выйти из цикла?

public void Dispose()
{
    this.abort = true;
}

// в цикле потока ...

if (this.abort)
{
    break;
}

Вместо этого использовать класс BackgroundWorker?

Ответы [ 3 ]

4 голосов
/ 08 мая 2009

Я хотел бы расширить ответ, предоставленный "lc" (что в противном случае здорово).

Чтобы использовать его подход, вам также нужно пометить логический флаг как "volatile". Это создаст «барьер памяти», который будет гарантировать, что каждый раз, когда ваш фоновый поток читает переменную, что он будет извлекать ее из памяти (в отличие от регистра), и что, когда переменная записывается, данные передаются между кешами ЦП .

3 голосов
/ 08 мая 2009

Вместо бесконечного цикла используйте логический флаг, который может быть установлен основным классом в качестве условия цикла. Когда вы закончите, установите флаг, чтобы цикл мог корректно завершиться. Если вы реализуете IDisposable, установите флаг и дождитесь завершения потока, прежде чем вернуться.

Вы можете реализовать отменяемый класс BackgroundWorker, но, по сути, он будет выполнять то же самое.

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

Причина, по которой я считаю Thread.Abort считается "злом", заключается в том, что он оставляет вещи в неопределенном состоянии. Однако, в отличие от уничтожения всего процесса, остальные потоки продолжают работать и могут столкнуться с проблемами.

0 голосов
/ 08 мая 2009

Я бы предложил метод BackgroundWorker. Это относительно просто реализовать и хорошо убирает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...