【问题标题】:Background Worker Process or Thread?后台工作进程或线程?
【发布时间】:2009-08-27 19:27:48
【问题描述】:

我有一个 Winform 应用程序,它在网格视图中列出了一批发票。用户选择批次并单击“生成发票”按钮。该过程大约需要4-5分钟。当它正在运行时,我将有一个选框进度条,并希望禁用所有按钮。

我应该使用 BackgroundWorker 进程还是创建一个新线程来运行此任务?

【问题讨论】:

    标签: winforms multithreading


    【解决方案1】:

    这正是 BackgroundWorker 所指的任务类型。您应该将其推送到后台工作程序中,并允许它运行。这提供了一种更新进度条等的简单方法。

    没有理由为此创建自己的线程。通过 BackgroundWorker 的 ThreadPool 将运行良好。

    【讨论】:

    • 后台工作者是否使用框架中的相同线程池?那为什么不直接使用线程池呢?
    • @ThePoet 它确实使用相同的线程池。不过,它提供了许多功能来自动将进度和完成编组回初始同步上下文。如果使用ThreadPool.QueueUserWorkItem,则必须自己进行编组,这样更容易出错。
    【解决方案2】:

    后台工作进程的线程数量有限(20 或 25 个,具体记不清了),使用其中一个会使该线程停止运行 4-5 分钟。通常建议不要将后台工作进程用于长时间运行的任务,但是如果您一次只运行一个线程,这并不是真正的问题。

    在理想情况下,我可能会创建自己的线程,但这需要努力和理解。

    【讨论】:

      【解决方案3】:

      单独的进程当然会更安全:如果它有任何问题(崩溃、无限循环、泄漏或其他) - 这些问题不会影响父进程。

      【讨论】:

        【解决方案4】:

        后台工作人员更容易,并且专为您的情况设计(check the first few lines of msdn)

        所以我会遵循 KISS 原则 :)

        实际上后台工作线程比普通线程还要快! 因为它由线程池支持,所以它避免了昂贵的线程重新创建。

        关于 Jaimal Chohan 提到的限制:因为后台工作程序由线程池支持,所以它有 25 个并行任务的限制,但这对于任何 gui 应用程序来说应该足够了。 (如果你以某种方式超过了这个数字,进一步的任务将只是等待其他人完成)

        【讨论】:

          【解决方案5】:

          如果工作进程中存在内存泄漏,肯定是后台进程。

          【讨论】:

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