2

有人可以看看并告诉我我的代码有什么问题吗?我正在“即时”创建 2 个 BackgroundWorkers 并尝试同时启动它们。类 Listen 和 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();
}
4

3 回答 3

1

谢谢费雷塔利卡!_ 我无法将您的评论标记为最佳答案,所以我在这里写:这正是解决问题的原因,BackgroundWorker bw2 对 bw1 来说太快了,所以我添加了睡眠时间:

        bw1.RunWorkerAsync();
        System.Threading.Thread.Sleep(1000);
        bw2.RunWorkerAsync();

现在 bw1 有足够的时间启动,在 bw2 启动之前,一切正常!谢谢大家!你太棒了!简单的解决方案是最好的!

于 2013-08-18T14:56:41.043 回答
1

You can use a CountdownEvent in the threads waiting for the signal.

于 2013-08-18T17:26:06.203 回答
0

我没有看到任何迹象表明您的代码无法按预期工作。是否可能是因为 bw1 即将完成,所以当 bw2 被调用时,它似乎是连续的?例如,如果您Thread.Sleep(10000)在 bw1 委托中添加 a,那么 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 完成

于 2013-08-19T00:05:54.373 回答