【问题标题】:Handling multiple operations using BackgroundWorker使用 BackgroundWorker 处理多个操作
【发布时间】:2011-09-12 11:39:33
【问题描述】:

我在 winform 上有一个 DataGridView。我在表单的加载方法中动态添加 DatagridViewButtonColumn,按钮名称为 btnAction,其上显示的文本为“Process”。

因此,网格中的每一行的最后一列都会有这个处理按钮。

在此按钮的单击事件中,我使用 BackgroundWorker 来调用执行某些计算的方法。计算结束后,我需要在网格中的该行中将单击按钮的文本更新为“已处理”。现在,我该如何处理这种情况?--> 用户点击多个Process按钮,我需要触发网格中所有对应行的计算。可以使用BackgroundWorker处理还是我需要在这里使用线程?

如果可能,请协助使用代码 sn-p。

【问题讨论】:

  • 就上下文而言,之前有人问过这个问题,后台工作人员的响应是哪里出了问题。 stackoverflow.com/questions/6291842/…。现在我认为问题在于运行多个后台进程。 @user74042 对吗?
  • 是的,没错,大卫。谢谢。

标签: c# winforms multithreading datagridview backgroundworker


【解决方案1】:

我在使用 BackgroundWorker 进程时遇到了类似的情况。

以下 Codeproject 文章帮助我解决了很多问题。

http://www.codeproject.com/KB/cpp/BackgroundWorker_Threads.aspx

【讨论】:

    【解决方案2】:

    简短的回答是,相同的 BackgroundWorker 在运行时无法再次调用。如果你这样做,你会得到一个错误:

    这个 BackgroundWorker 当前是 忙,无法运行多个任务 同时。

    此问题已在 StackOverflow 上讨论过:This BackgroundWorker is currently busy and cannot run multiple tasks concurrently

    您需要为每个按钮创建一个新的后台工作程序,或者将您的后台工作程序请求排队。有一个排队的后台工作人员实现here

    无论您采用哪种方式,都需要注意您编写的代码都是线程安全的。

    【讨论】:

    • 胸围 -> 忙吗? - 我想我更喜欢胸围:)
    • 这就是为什么我们应该在 StackOverflow 上复制代码示例而不是仅仅链接资源的示例...
    【解决方案3】:

    http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.runworkercompleted(v=vs.85).aspx

    将向您展示如何处理 backgroundworker.runworkercompleted 事件,该事件将让您在 backgroundworker 完成后执行某些操作(无论是错误还是完成,您都必须检查)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多