【问题标题】:Why is C# background worker thread version taking twice as long as single thread为什么 C# 后台工作线程版本耗时是单线程的两倍
【发布时间】:2011-11-28 14:52:40
【问题描述】:

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

后台版本的时间似乎是单线程版本的两倍。实际上,我期望后台工作线程版本是多线程的,但从我所能做的探测来看,它实际上并没有在单独的线程中运行。

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

我预计会有少量开销,但不会这么多 (100%)。

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

TIA, 保罗

【问题讨论】:

  • BackgroundWorker 在这里应该没问题。我们需要查看一些代码才能在这里找到您的问题。

标签: c# multithreading backgroundworker


【解决方案1】:

可能有多种原因,除非我们看到一些难以帮助的代码。不过我还是有一些建议:

首先,后台工作者并不意味着它是*多线程的,它意味着一个线程在后台而不是主UI线程中完成工作。如果线程你在后台推送是在做很多 UI,那么您将有很多同步上下文切换,这将使后台线程变得非常慢。

【讨论】:

  • 谢谢,我猜后台工作者不是真正的多线程。后台任务必须使用建模程序的 API,所以我真的不能不生成 UI 活动。除其他外,它将打开和关闭图表并将它们显示在工具的主要工作表面上 - 此外(可能)通过 API 更新图表上对象的大小和位置。我想这意味着我需要去创建一个适当的多线程情况。
  • @PaoloFCantoni:你明白了。
猜你喜欢
  • 2011-01-15
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 2010-10-24
  • 2011-06-29
  • 2013-06-05
相关资源
最近更新 更多