为什么C#后台工作线程版本的使用时间是单线程的两倍

时间:2011-11-28 06:22:03

标签: c# multithreading backgroundworker

我有一个用于UML建模产品的C#插件,可以自动绘制图表并对其进行维护。我正在处理具有超过6000个图表的大型企业模型。这需要很长时间(即使在更快的机器上)。所以我创建了一个版本,它使用后台工作线程来运行作业的“批处理”部分,而“前景”有一个模态对话框,允许我提前停止处理。否则,由于建模程序的UI,我无法向加载项发送“STOP”消息。

后台版本似乎需要两倍于单线程版本。实际上,我期待后台工作线程版本是多线程的,但是从我能够做到的探测实际上并没有在一个单独的线程中运行。

“模态”对话框和加载项正确通信,因此的两个功能位于不同的线程上。批处理通过DoWork方法在.RunWorkerAsync()下运行。但是如果我在代码中放置跟踪,他们会报告没有在不同的线程上运行(因为.Invoke Required设置为false)。

我原本预计会有少量开销,但不是很多(100%)。

发生了什么事?我应该转向真正的多线程(而不是BackgroundWorker)吗?

TIA, 保罗

1 个答案:

答案 0 :(得分:2)

除非我们看到一些难以帮助的代码,否则可能有几个原因。但是我有一些建议:

首先,后台工作者并不意味着它是*多线程的“,这意味着一个线程在后台执行作业而不是主UI线程。如果线程你正在推动后台正在做很多UI,那么你将有很多同步上下文切换,这将使后台线程真正变慢。