Самый правильный и потокобезопасный способ - использовать WaitHandle для подачи сигнала потоку, когда он должен остановиться. В основном я использую ManualResetEvent.
В вашей теме вы можете иметь:
private void RunThread()
{
while(!this.flag.WaitOne(TimeSpan.FromMilliseconds(100)))
{
// ...
}
}
, где this.flag
- это экземпляр ManualResetEvent. Это означает, что вы можете вызвать this.flag.Set()
извне потока, чтобы остановить цикл.
Метод WaitOne вернет true, только если флаг установлен. В противном случае он истечет по истечении заданного времени ожидания (в этом примере 100 мс), и поток снова будет проходить через цикл.