Блокировка требуется здесь из-за того, как написан ваш метод запуска, однако вам нужна только блокировка в Start()
(где это не сейчас) и Stop()
, так как они единственные, которые потенциально может вызвать состояние гонки в вашем случае.
Я бы полностью удалил блокировку из вашего метода SendLoop()
(это вызывает DeadLock , поскольку Stop
ожидает блокировки для установки _isRunning
, а ваш SendLoop
удерживает блокировку пока _isRunning
не будет установлено в false). Прямо сейчас, когда вы звоните Stop()
, блокировка не позволяет ему установить _isRunning = false;
Однако вам понадобятся блокировки в ваших Start()
и Stop()
методах (если вы не переделываете их структуру полностью). Что-то вроде:
public void Start()
{
lock (runLock)
{
if (_IsRunning == true)
return;
_IsRunning = true;
(new System.Threading.Thread(new System.Threading.ThreadStart(SendLoop))).Start();
}
}
public void Stop()
{
lock (runLock)
{
_IsRunning = false;
}
}
Это защитит вас от запуска двух потоков, а также предотвратит остановку Stop до запуска потока.