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