如果我在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是否会以某种方式阻止调度程序在监视器上等待时调用等待任务?
答案 0 :(得分:1)
不确定你害怕什么。 OnTextChanged和RunWorkerCompleted都在UI线程上运行。它不会重入,你也不需要锁。这两种方法只能在UI线程空闲时开始运行,从而引发消息循环。
答案 1 :(得分:0)
虽然与您的问题没有直接关系,但如果您未将 _running
标记为volatile
,则可能会遇到注册缓存问题。
实际上这并不完全正确,因为你没有使用双重检查锁。无论如何,我已经将与挥发性有关的信息留给了你,供你参考。