Я общая резьба n00b, и я хочу выяснить способ сначала закрыть нить, спросив красиво, затем силой.Как остановить поток от завершения в определенном разделе кода?
У меня есть ProcessManager
класс, который запускает кучу Process
класса нитей:
public class ProcessManager
{
private IProcessRepository _processRepository;
private List<Thread> _threads = new List<Thread>();
public ProcessManager(IProcessRepository processRepository)
{
_processRepository = processRepository;
}
public void StartAllProcesses()
{
foreach (var process in _processRepository.GetActiveProcesses())
{
var thread = new Thread(process.ProcessUntilStopped);
_threads.Add(thread);
thread.Start();
}
}
public void StopAllProcesses()
{
// What to do here?
}
}
public class Process
{
private bool _stopFlag = false;
public void ProcessUntilStoppped()
{
while (true)
{
if (_stopFlag) return;
// I don't want this call interrupted by Thread.Join(),
// but it's important for multiple Processes to be able to DoWork()
// simultaneously.
DoWork();
}
}
public void Stop()
{
_stopFlag = true;
}
}
Как я могу получить мою нить не прерывается во время вызова DoWork()
и вместо того, чтобы ждать до следующего цикла итерации, чтобы остановить? (Я понимаю, что lock
здесь не подходит, потому что несколько потоков должны иметь возможность звонить DoWork()
, пока они работают, поэтому нет ресурса, который должен быть взаимоисключающим.)
Как проверить, мой поток прекратился красиво, а если нет, заставьте его остановиться? (Я знаю, что Thread.Abort()
- плохая карма.)
Я полагаю, что это должна быть распространенная проблема с довольно стандартным решением, но я не очень хорошо знаком с правильной номенклатурой или методами .NET для вызова.
Мой ответ был опубликован после того, как вы приняли ответ, и это нормально.Просто убедитесь, что вы отмечаете _stopFlag как изменчивый. –