【问题标题】:How to force sequential execution on BackgroundWorker如何在 BackgroundWorker 上强制顺序执行
【发布时间】:2012-02-29 19:26:29
【问题描述】:

我在 C# .Net 4 中有一个 backgroundworker_dowork() 事件,它调用三个方法,我希望它们同步执行。

鉴于我的限制,方法 3 必须在方法 2 之后执行,方法 2 必须在方法 1 之后执行。

但是,在BackgroundWorker 中,所有三个方法都是异步执行的。

我该如何更改?

private void bgwLoading_DoWork(object sender, DoWorkEventArgs e)
{
    ArrayList a = (ArrayList)e.Argument;

    string[] fileNames = (string[])a[0];
    bool isLoad = (bool)a[1];

    this.loadMultiImages(fileNames, isLoad);
}

private void loadMultiImages(string[] fileNames, bool isLoad)
{
    // I want to execute the following codes sequentially.
    Bitmap newBtmap = saveJpeg();
    this.SafeInvoke(d => d.imageList.Images.Add(newBtmap));
}

由于SafeInvoke()saveJpeg() 花费的时间更少,它在saveJpeg() 完成之前开始执行,从而改变了我想要的执行流程。

【问题讨论】:

  • 非常具有误导性的标题。线程优先级是一个完全不同的概念。
  • 如果要同步执行,为什么要使用异步执行?
  • 你在做什么让 saveJpeg 返回调用 SafeInvoke 而没有“完成”?

标签: multithreading c#-4.0 backgroundworker


【解决方案1】:

如果方法 3 依赖于方法 2,方法 2 依赖于方法 1,那么执行它们的方法只有一种顺序。即使您分配多个线程来执行它们,您仍然必须按照 1->2->3 的顺序执行这些方法。

您可以使用各种构造来强制方法 2 等待方法 1 和方法 3 等待方法 2,但您仍然基本上是同步执行方法,所以您还不如只使用 1 个线程来执行所有 3 个方法.

【讨论】:

    【解决方案2】:

    你可能想要这样的东西。后台操作完成后使用RunWorkerCompleted事件调用方法:

    var bg1 = new System.ComponentModel.BackgroundWorker();
    var bg2 = new System.ComponentModel.BackgroundWorker();
    var bg3 = new System.ComponentModel.BackgroundWorker();
    bg1.RunWorkerCompleted += (s, e) =>
    {
        bg2.RunWorkerAsync();
    };
    bg2.RunWorkerCompleted += (s, e) =>
    {
        bg3.RunWorkerAsync();
    };
    bg1.RunWorkerAsync();
    

    但是,我不确定这种模式的有效性。如果要同步调用函数,请同步调用它们。可能有比使用后台工作人员更好的方法。

    如果要在后台同步运行3个程序,只需在后台线程中同步调用即可:

    var bg1 = new System.ComponentModel.BackgroundWorker();
    bg1.DoWork += (s, e) =>
    {
        Process1();
        Process2();
        Process3();
    };
    bg1.RunWorkerAsync();
    

    【讨论】:

      猜你喜欢
      • 2010-12-23
      • 1970-01-01
      • 2017-09-06
      • 2011-10-01
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多