【问题标题】:Does the BackgroundWorker provide real multithreading?BackgroundWorker 是否提供真正的多线程?
【发布时间】:2011-01-16 11:52:39
【问题描述】:

学习构建多线程 WPF 应用程序 我读到了一些使用 BackgroundWorker 的限制,这对我来说不是很清楚。请帮我理解:

如果我不仅希望一个线程在 UI 的后台工作,而且可能有多个线程,彼此独立地开始和结束,BackgroundWorker 是否适合这种情况?我可以有多个 BackgroundWorker 实例吗?

简单来说,BackgroundWorker 是否提供了多线程而不是简单的双线程?

【问题讨论】:

  • 你有链接到你读到的限制吗?
  • @Mark Byers 例如这一段(来自 Matthew MacDonald 的“Pro WPF in C# 2008”一书):“注意:如果您有一个在后台运行的单个异步任务,则 BackgroundWorker 是完美的从头到尾(可选支持进度报告和取消)。如果您有其他想法 - 例如,在应用程序的整个生命周期中运行的异步任务或在应用程序执行时与应用程序通信的异步任务工作,您需要使用 .NET 的线程支持来设计定制的解决方案。”
  • 我认为这更多的是关于什么是好的设计的问题,而不是技术上可能的问题。您可以创建许多 BackgroundWorker,但这可能不是解决问题的最佳方式。

标签: .net wpf multithreading backgroundworker


【解决方案1】:

每个BackgroundWorker 在单独的线程上运行一个。您可以根据需要创建尽可能多的后台工作线程来并行运行操作,因此从这个意义上说,它是真正的多线程。

BackgroundWorker 的好处是您可以轻松订阅在耗时任务完成时将在您的 UI 线程上触发的事件。

使用BackgroundWorker其实很简单:

var worker1 = new System.ComponentModel.BackgroundWorker();
worker1.DoWork += (sender,e) => Thread.Sleep(10000);
worker1.RunWorkerCompleted += (sender,e) => MessageBox.Show("Worker1 Finished!");
worker1.RunWorkerAsync();

【讨论】:

    【解决方案2】:

    您引用的限制(来自 Pro WPF)源于 BGW 使用 ThreadPool 的事实,因此所有关于 ThreadPool 线程的rules and adivice 都适用。

    【讨论】:

    • 感谢您提供有用的信息和链接 +1
    【解决方案3】:

    如果您创建了许多 BackgroundWorker 实例,那么您将获得许多线程,但单个实例仅提供单个后台任务。

    【讨论】:

      【解决方案4】:

      是的,在内部,后台工作人员在您获得委托时调用 BeginInvoke。这将导致您的委托被放置在 CLR 中的线程池中。

      【讨论】:

        猜你喜欢
        • 2017-11-23
        • 2012-07-15
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        • 2021-11-02
        • 1970-01-01
        • 2011-03-04
        • 2021-02-16
        相关资源
        最近更新 更多