我可以在WPF中使用Monitor.Enter / Exit(c#lock)而不用担心重入错误吗?

时间:2011-01-02 21:13:58

标签: wpf multithreading thread-safety backgroundworker

如果我在WPF应用程序中使用Monitor.Enter / Exit(通过c#lock语法),调度程序是否可以重新进入?

在下面的示例中,假设文本框中的文本发生更改时调用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 个答案:

答案 0 :(得分:1)

不确定你害怕什么。 OnTextChanged和RunWorkerCompleted都在UI线程上运行。它不会重入,你也不需要锁。这两种方法只能在UI线程空闲时开始运行,从而引发消息循环。

答案 1 :(得分:0)

虽然与您的问题没有直接关系,但如果您未将_running标记为volatile,则可能会遇到注册缓存问题。

实际上这并不完全正确,因为你没有使用双重检查锁。无论如何,我已经将与挥发性有关的信息留给了你,供你参考。