【发布时间】: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