Могу ли я использовать Monitor.Enter / Exit (c # lock) с WPF, не опасаясь ошибок при входе? - PullRequest
0 голосов
/ 03 января 2011

Если я использую Monitor.Enter / Exit (через синтаксис c # lock) в приложении WPF, может ли диспетчер вызвать повторный вход?

В приведенном ниже примере предполагается, что OnTextChanged вызывается, когда текст визменяется текстовое поле, может ли вызов _worker.RunWorkerAsync () быть вызван неправильно?

public class SomeClass
{
    private object _locker = new object();
    private bool _running = false;
    private BackgroundWorker _worker;

    public void SomeClass()
    {
        // initialize worker...
    }

    void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        lock (_locker)
            _running = false;
    }

    void _worker_DoWork(object sender, DoWorkEventArgs e)
    {
        // ... do something time consuming ...
    }

    private void OnTextChanged()
    {
        lock(_locker)
        {
            if (!_running)
            {
                _worker.RunWorkerAsync();
                _running = true;
            }
        }
    }
}

Я считаю, что это возможно, но я не смог воспроизвести это.WPF каким-то образом препятствует тому, чтобы диспетчер вызывал ожидающие задачи при ожидании на мониторе?

Ответы [ 2 ]

1 голос
/ 03 января 2011

Не уверен, чего ты боишься.И OnTextChanged, и RunWorkerCompleted запускаются в потоке пользовательского интерфейса.Это не будет входом, замок вам тоже не нужен.Любой метод может запускаться только тогда, когда поток пользовательского интерфейса простаивает, закачивая цикл сообщений.

0 голосов
/ 03 января 2011

Хотя это не имеет прямого отношения к вашему вопросу, вы можете столкнуться с проблемами кэширования реестра, если не пометите _running как volatile.

На самом деле это не совсем так, поскольку вы не используете двойную проверку блокировки.Я все равно оставил информацию, связанную с volatile, для вашей справки.

...