Compact Framework上的BackgroundWorker实现

时间:2012-09-07 13:22:32

标签: c# .net multithreading compact-framework opennetcf

我正在查看.NET紧凑框架的OpenNETCF SDF BackgroundWorker实现中的代码,看起来以下代码不是线程安全的。但智能设备框架已存在多年,所以我错过了什么?这是线程安全的,如果是,为什么?

请注意,即使SDF可以免费使用,我也不倾向于发布全班,期望客户为SDF支付许可费。如果任何一个SDF团队反对这个教育摘录,那么我会立即提出问题。

这是后台线程,它将方法调用取消以在UI线程上调用它们:

private void ProgressDispatcherProc()
{
    this.m_stopThreads = false;
    while (!this.m_stopThreads)
    {
        while (this.m_progressQueue.Count > 0)
        {
            MethodInvoker method = null;
            ProgressChangedEventArgs args = this.m_progressQueue.Dequeue();
            if (this.ProgressChanged != null)
            {
                if (method == null)
                {
                    method = () => this.ProgressChanged(this, args);
                }
                this.m_guiMarshaller.BeginInvoke(method);
                Application.DoEvents();
            }
        }
        Thread.Sleep(this.WorkerReportsProgress ? 5 : 0x3e8);
    }
}

变量m_progressQueue是标准的System.Collections.Generic.Queue<&gt ;.

我担心的是没有锁定来保护队列,队列在一个线程中排队并在此线程中出列。在while (!this.m_stopThreads)中完成的简单布尔循环我认为是足够安全的,因为据我所知,在.NET Compact Framework中,所有变量访问都被视为volatile。

1 个答案:

答案 0 :(得分:2)

我同意它应该锁定,至少在Dequeue电话周围,这样的话:

lock(m_progressQueue.SyncRoot)
{
    ProgressChangedEventArgs args = this.m_progressQueue.Dequeue(); 
}

它可能会在课程的其他部分使用它们。