2015-11-25 4 views
1

У меня есть три задачи async, которые необходимо выполнить в такой последовательности. Сначала, если сначала будет завершено, начните делать Second, а когда Second будет завершено, начните делать третье. Но я думаю, что мое решение не очень хорошо. Можете ли вы предложить что-то лучше?Синхронизация задачи Async

namespace WpfApplication215 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new AsyncWork(); 
    } 
} 
public class AsyncWork 
{ 
    public List<int> Items { get; set; } 
    public AsyncWork() 
    { 
     Action FirstPart = new Action(ComputeFirstpart); 
     IAsyncResult result1 = FirstPart.BeginInvoke(null, null); 
     if (!result1.AsyncWaitHandle.WaitOne(0, false)) 
     { 
      Action SecondPart = new Action(ComputeSecondPart); 
      IAsyncResult result2 = SecondPart.BeginInvoke(null, null); 
      if (!result2.AsyncWaitHandle.WaitOne(0, false)) 
      { 
       Action ThirdPart = new Action(ComputeThirdPart); 
       IAsyncResult result3 = ThirdPart.BeginInvoke(null, null); 
      } 
     } 

    } 

    public void ComputeFirstpart() 
    { 
     Random rnd = new Random(); 
     System.Threading.Thread.Sleep(rnd.Next(1000,5000)); 
     Console.WriteLine("First Task Completed"); 
    } 

    public void ComputeSecondPart() 
    { 
     Random rnd = new Random(); 
     System.Threading.Thread.Sleep(rnd.Next(1000, 5000)); 
     Console.WriteLine("Second Task Completed"); 
    } 

    public void ComputeThirdPart() 
    { 
     Random rnd = new Random(); 
     System.Threading.Thread.Sleep(rnd.Next(1000, 5000)); 
     Console.WriteLine("Third Task Completed"); 
    } 
} 

ответ

5

Существующий код не работает, потому что вы можете просто не выполнять оставшийся код или параллельно выполнять методы, которые вы хотели бы предотвратить.

Что с этим ?:

Task.Run(() => { 
F1(); 
F2(); 
F3(); 
}); 

Вы можете сделать это асинхронная, если вы хотите.

Кроме того, вы можете не знать, что IAsyncResult устарел в 99% случаев.

+0

Это очень странно, но этот код работает. – A191919

+0

@ A191919 * * * * работа, но я удивлен, что он вообще делает. Сроки должны привести к ошибке 99,9999% случаев, потому что WaitOne (0) должен почти всегда терпеть неудачу. Обновление: WaitOne вернет в основном false, поэтому проверки пройдут, и вы выполняете параллельные методы. Так что в 99,999% случаев у вас есть ошибка. – usr

+0

Полностью согласен с «IAsyncResult» - он полностью устарел. – Gusdor