Рассмотрим следующую функцию, которая реализует неблокирующий доступ только к одному потоку.
public bool TryCancelGroup()
{
if (Monitor.TryEnter(_locked))
{
if (_locked == false)
{
_locked = true;
try
{
// do something
}
catch (Exception ex)
{
_locked = false;
}
finally
{
Monitor.Exit(_locked);
}
}
return _locked;
}
else
{
return false;
}
}
И вот как определяется переменная _locked
.
bool _locked = false;
Теперь, когда программа достигает Monitor.Exit(_locked);
, она выдает сообщение System.Threading.SynchronizationLockException
, в котором говорилось, что _блокированная переменная ранее не синхронизировалась.
Все это работало до того, когда переменная _locked была определена как объект
object _locked = new object();
Когда я изменил его на bool, чтобы использовать его как логический флаг, я начал получать это исключение.