【问题标题】:Synchronous work in a BackgroundWorkerBackgroundWorker 中的同步工作
【发布时间】:2008-12-22 22:45:01
【问题描述】:

我的应用程序在多个文件上独立执行耗时的工作。我创建了一个 BackgroundWorker 来将工作传递给每个文件,但似乎 backgroundworker 只能执行异步工作。是否可以同时执行多个异步任务,或者是否有类似的对象可以执行同步操作?

【问题讨论】:

  • 这看起来很奇怪。工作是同步的还是异步的?如果它是同步的,那么你需要在继续之前等待它,那你为什么要将它传递给一个后台工作人员,这意味着在后台做事情?

标签: c# multithreading backgroundworker


【解决方案1】:

后台工作程序通常用于更新 UI 和/或传递工作,这样您就不会在长时间运行的进程发生时冻结 UI。这意味着您“传递”后台工作进程“文件工作”,然后使用回调(通常)更新 UI,在此期间您的 APP 保持响应。

如果这些项目是独立的,那么您可能需要处理几个线程来拆分工作。再说一次,如果我理解正确的话。如果我是,那么您可能想查看Jon Skeet's 线程文章。

【讨论】:

    【解决方案2】:

    虽然您可以使用 BackgroundWorker,但我认为您应该简单地分拆几个线程来完成这项工作。一个线程(可能是主线程)将创建并启动这些工作线程,然后对所有工作线程执行 Join 以等待处理完成。

    或者,如果您使用的是 .Net 3.5,请查看Parallel Extensions for .Net。该库中的 Task 对象可能非常适合您的情况。

    【讨论】:

    • Joe Duffy 很棒,并行扩展很棒,但它们仍在 CTP 中
    • 仍在 CTP 中,但经过我的测试非常稳定。当然,您的里程可能会有所不同!
    【解决方案3】:

    您可以通过在代码中创建多个 BackgroundWorker 对象来执行多个异步任务。我们创建了一个 JobPool 类,该类创建了许多要运行的 BackgroundWorker 对象,以便我们可以随时控制运行的总数。但是,如果您只处理几个文件,这将是多余的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多