【问题标题】:BackgroundWorker implementation on Compact Framework在 Compact Framework 上的 BackgroundWorker 实现
【发布时间】:2012-09-07 13:22:31
【问题描述】:

我正在查看 .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。

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

【问题讨论】:

  • 我毫不犹豫地发布此内容以进一步了解代码的工作原理。这就是我们做我们所做的事情的原因。

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


【解决方案1】:

我同意它应该有一个锁,至少在 Dequeue 调用周围,像这样:

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

它可能会在课堂的其余部分使用它们。

【讨论】:

  • 嗨,克里斯。不久前我写了一个 BackgroundWorker-ish 例程,但我肯定从未使用过ProgressChangedEventArgs 的队列。我正在研究这个并试图理解它背后的逻辑。您能否提供一些信息说明为什么要这样做?
  • 队列允许 ReportProgress 做 2 件事:1) 将进度事件编组到 UI 线程和 2) 在所有进度处理程序都在做事情时使调用者阻塞。
  • 感谢您的回答。后续,我对Application.DoEvents很好奇。这不应该是严格需要的,因为这个线程没有阻塞 UI 线程?另外,我一直想知道你是否可以从外部线程中抽取 UI 消息泵……我一直认为它会忽略来自非 UI 线程的调用。
  • DoEvents 应该是不需要的。不要从后台线程调用它(它会被忽略或死掉,不确定)。
猜你喜欢
  • 2018-12-26
  • 2011-10-24
  • 1970-01-01
  • 2013-06-20
  • 2010-09-26
  • 1970-01-01
  • 2014-08-08
  • 2020-05-14
  • 2011-07-01
相关资源
最近更新 更多