有些人可以看看并告诉我我的代码有什么问题吗? 我正在“动态”创建2个BackgroundWorkers并试图以同样的方式启动它们。 类Listen and Scan背后的代码在单独执行时工作正常,但是当尝试以下面描述的方式执行它们时,由于某种原因它们总是一个接一个地启动。
private void btn_Start_BACKWorkers_Click(object sender, RoutedEventArgs e)
{
string one = tbx_id1.Text;
string second = tbx_id2.Text;
string Status = "";
var bw1 = new BackgroundWorker();
bw1.DoWork += delegate
{
string SelectedNumber = "0";
Listen myListen = new Listen(SelectedNumber );
TOTALlist = myListen.Main();
lbox_TOTAL.ItemsSource = addIPlist;
};
var bw2 = new BackgroundWorker();
bw2.DoWork += delegate
{
Send newScan = new Send(one , second);
string Status = newScan.hey();
FinalStatus = Status;
lbl_SendStatus.Content = FinalStatus ;
};
bw1.RunWorkerAsync();
bw2.RunWorkerAsync();
}
答案 0 :(得分:1)
谢谢 FerretallicA ! 我不能将你的评论标记为最佳答案,所以我在这里写: 这正是解决问题的原因,BackgroundWorker bw2对于bw1来说太快了所以我增加了睡眠时间:
bw1.RunWorkerAsync();
System.Threading.Thread.Sleep(1000);
bw2.RunWorkerAsync();
现在bw1有足够的时间开始,在bw2启动之前它运行良好! 谢谢你们所有人!你太棒了! 简单的解决方案是最好的!
答案 1 :(得分:1)
您可以在等待信号的线程中使用CountdownEvent。
答案 2 :(得分:0)
我认为没有任何迹象表明您的代码无法正常运行。是因为bw1即将完成,所以当bw2被调用时,出现是顺序的吗?例如,如果在bw1委托中添加Thread.Sleep(10000)
,bw2在启动之前是否仍然等待bw1?
例如:
bw1.DoWork += delegate {
Console.WriteLine("Worker 1 started");
Thread.Sleep(10000);
Console.WriteLine("Worker 1 finished");
};
bw2.DoWork += delegate {
Console.WriteLine("Worker 2 started");
Console.WriteLine("Worker 2 finished");
};
bw1.RunWorkerAsync();
bw2.RunWorkerAsync();
应该产生:
工人1开始
工人2开始
工人2完成了
工人1完成了