Использование оператора блокировки в цикле в 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();
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос