0

我有这样的代码:

if (condition#1) {
   // step 2
   ConfigurazioneSA csa = new ConfigurazioneSA(...);
   WconfiguraSA.RunWorkerAsync(csa);
}
else
{
   // step 1
   PassaggioIE bo = new PassaggioIE(...);
   WpassIE.RunWorkerAsync(bo);

   if (condition#2) {
      // step 2
      ConfigurazioneSA csa = new ConfigurazioneSA(...);
      WconfiguraSA.RunWorkerAsync(csa);
   }
}

当执行流程在condition#1分支内时,该step 1块先前已执行(在我的应用程序的先前执行中),因此step 2可以毫无问题地执行。

但是,当执行流程在else分支内时,我需要执行step 1,当这一步完成时,我可以执行step 2. 由于我使用BackgroundWorker作为第 1 步开始,因此step 2在导致错误后立即开始。

我会同步这个生产者/消费者问题,尽可能少地增加熵。我发现的所有解决方案都会引入大量代码,而我会使用一个简单的信号量来避免step 2执行直到step 1未完成。有任何想法吗?

4

3 回答 3

1

我会建议你使用Tpl这个。这可以很容易地实现。

    Task.Factory.StartNew(() =>
    {
        //Step1
    }).ContinueWith(antecedent =>  //executed after step1 is done
    {
        if (condition#2) 
        {
        // step 2
        }
    });

另请注意,您不会得到像Progressand之类的事件Completed,您必须做出牺牲。 Completed事件类似于ContinuationTask

这里的另一个区别是ContinuationTask在线程池线程中执行,如果你想在 UI 线程中使用TaskScheduler.FromCurrentSynchronizationContext

于 2013-10-02T07:51:41.423 回答
0

如果您不想使用任务,则可以使用BackgroundWorker.RunWorkerCompleted执行完成时引发的事件。

// step 1
PassaggioIE bo = new PassaggioIE(...);

WpassIE.RunWorkerCompleted += (sender, e) => {

    // You might want to add error handling code here.

    if (condition#2) {
        // step 2
        ConfigurazioneSA csa = new ConfigurazioneSA(...);
        WconfiguraSA.RunWorkerAsync(csa);
    }
}

WpassIE.RunWorkerAsync(bo);

但我认为使用 TPL 也更好。

于 2013-10-02T08:30:37.493 回答
0

IsBusy例子:

else
{
   // step 1
   PassaggioIE bo = new PassaggioIE(...);
   WpassIE.RunWorkerAsync(bo);

   // wait for WpassIE to complete
   while(WpassIE.IsBusy) Application.DoEvents();

   if (condition#2) {
      // step 2
      ConfigurazioneSA csa = new ConfigurazioneSA(...);
      WconfiguraSA.RunWorkerAsync(csa);
   }
}

在此解决方案中,您必须等待 WpassIE 完成。

并且不要使用Thread.SleepApplication.DoEvents因为它会导致像BackgroundWorkers never stop being busy之类的问题。

于 2013-10-02T23:35:57.953 回答