Запуск и остановка (принудительная) резьбовой работы

Я хочу знать, как правильно начать и остановить работу с натянутой резьбой, которая была принудительной и невынужденной. Это правильный способ остановить stream?

public class ProcessDataJob : IJob { private ConcurrentQueue _dataQueue = new ConcurrentQueue(); private volatile bool _stop = false; private volatile bool _forceStop = false; private Thread _thread; private int _timeOut = 1000; public void Start() { _stop = false; _forceStop = false; _thread = new Thread(ProcessData); _thread.Start(); } private void ProcessData() { while (!_stop || _dataQueue.Count > 0) { if(_forceStop) return; byte[] data; if(_dataQueue.TryDequeue(data)) { //Process data //.....// } } } public void Stop(bool force) { _stop = true; _forceStop = force; _thread.Join(_timeOut); } public void Enqueue(byte[] data) { _dataQueue.Enqueue(data); } } 

Не существует правильного способа принудительного уничтожения streamа.

Есть несколько способов сделать это, но ни один из них не является правильным .

Принудительно убивать stream – это то, что вы должны делать только в том случае, если вам нужно прекратить работу программы или выгрузить приложение, содержащее stream, и не заботьтесь о том, чтобы какие-либо структуры данных оставались свисающими в поврежденном / плохом / заблокированном состоянии, потому что они будут в скором времени.

В Интернете много советов о том, как плохо / злой Thread.Abort, так что не делайте этого.

Вместо этого напишите правильную совместную резьбу. Нить (ы) должны сами проверять флаг (событие, volatile bool field и т. Д.), А затем добровольно выходить, когда приятно просят сделать это.

Это правильный путь.

Именно так я и делал это в прошлом, с одним отличием. В прошлом у меня были неожиданные зависания, что означает, что этот цикл не возвращается с ответом. Чтобы решить эту проблему, я использую все classы, например, ваши, зарегистрируйтесь в classе «manager», который отвечает за участие в таких ключевых моментах, как принудительная остановка. Класс threaded имеет ссылку на менеджера, и когда принудительная остановка выполняется, он вызывает метод менеджера, который фактически является таймером. Если к тому времени, когда таймер ушел, streamовый class не установил флаг состояния в STOPPED, тогда менеджер вызывает его прерывание.

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

Вы можете использовать class .NET ThreadPool , так что вам не придется самостоятельно обрабатывать стек.