如何在BackgroundWorker上强制执行顺序执行

时间:2012-02-29 19:26:30

标签: multithreading c#-4.0 backgroundworker

我在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()完成之前开始执行,从而改变我想要的执行流程。

2 个答案:

答案 0 :(得分:2)

如果方法3依赖于方法2,方法2依赖于方法1,那么只有一种方法可以执行它们顺序。即使你执行多个线程任务,你仍然仍然必须按顺序1-> 2> 3执行方法。

您可以使用各种构造来强制方法2等待方法1和方法3等待方法2,但您仍然可以从根本上同步执行方法,因此您也可以只使用1个线程来执行所有3个方法

答案 1 :(得分:0)

你可能想要这样的东西。在后台操作完成后使用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();