Как мне безопасно заблокировать это свойство? - PullRequest
3 голосов
/ 06 августа 2011

У меня есть частичный код C # для очереди блокировки, которая выглядит следующим образом:

private bool flushed;
private object _locker = new object();

public bool Flushed
{
    get { lock (_locker) { return flushed; } }
    set
    {
        lock (_locker)
        {
            flushed = value;
            Monitor.Pulse(queue);
        }
    }
}

Метод Monitor.Pulse имеет аналог Monitor.Wait в методе Dequeue() очереди блокировки.

Я хочу добавить метод, который сигнализирует об окончании данных, который проверяет условие Flush. Это будет выглядеть примерно так:

public bool EndOfData
{
    get { lock (_locker) { return Flushed && (queue.Count == 0); } }
}

Вот мой вопрос. Должен ли я вызывать свойство Flushed, как показано в приведенном выше коде (принимая вложенный lock), или достаточно обратиться к закрытой переменной-члену flushed напрямую, как показано ниже, используя только один блокировка

public bool EndOfData
{
    get { lock (_locker) { return flushed && (queue.Count == 0); } }
}

1 Ответ

2 голосов
/ 06 августа 2011

Не думаю, что это имеет значение, лично я бы использовал вложенную версию.Я думаю, что если что-то изменится в фактическом свойстве, используя его, Flushed, вы убедитесь, что все идет хорошо.

Но я действительно считаю, что это вызов предпочтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...