Использование оператора блокировки в цикле в C #
Давайте возьмем пример класса SomeThread, в котором мы пытаемся предотвратить вызов методов DoSomething после того, как для свойства Running установлено значение false, а класс OtherThread вызывается для Dispose, потому что, если они вызываются после того, как метод Dispose будет выполнен, мир закончится так, как мы знаю это.
Такое ощущение, что из-за петли есть шанс, что что-то плохое случится. Что в тот момент, когда он запускает следующий цикл и до того, как будет снята блокировка, перед вызовом методов DoSomething, значение Running может быть изменено на false, и Disposed вызывается до того, как он попадает в блокировку. В этом сценарии жизнь не будет хорошей.
Я искал способы справиться с этим при использовании цикла простым и легким в обслуживании методом. Для записи, которую я считал шаблонной проверкой двойной блокировки, это не рекомендуется для C #.
Предупреждение: Это упрощенный пример, чтобы попытаться упростить фокусировку на проблеме с помощью цикла и блокировки внутри него. Если бы я неЯ не знаю, какое место, пожалуйста, дайте мне знать, и я сделаю все возможное, чтобы заполнить любые детали.
public class SomeThread : IDisposable
{
private object locker = new object();
private bool running = false;
public bool Running
{
get
{
lock(locker)
{
return running;
}
}
set
{
lock(locker)
{
running = value;
}
}
}
public void Run()
{
while (Running)
{
lock(locker)
{
DoSomething1();
DoSomething2();
}
}
}
private void DoSomething1()
{
// something awesome happens here
}
private void DoSomething2()
{
// something more awesome happens here
}
public void Dispose()
{
lock (locker)
{
Dispose1();
Dispose2();
}
}
private void Dispose1()
{
// something awesome happens here
}
private void Dispose2()
{
// something more awesome happens here
}
}
public class OtherThread
{
SomeThread st = new SomeThread();
public void OnQuit()
{
st.Running = false;
st.Dispose();
Exit();
}
}