2015-02-16 18 views
7

Ho una situazione in cui voglio attivare un numero definito dall'utente di attività in modo asincrono e attendere che tutti vengano completati. Semplificato, ecco cosa ho a che fare con:Spegnimento di più attività in modo asincrono e in attesa che vengano completati

[TestMethod] 
public async Task Start() { 
     var numDrivers = 2; 
     while (numDrivers != 0) { 
      var rnd = new Random(); 
      var r = rnd.Next(itemArray.Count); 
      var target = itemArray[r]; 
      var proxyDriver = GetProxiedDriver(); 
      Task.Run(() => HandleIntro(proxyDriver, target)); 
      numDrivers--; 
     } 
} 

Per alcuni contesto - questi sono webdrivers Selenio sempre filato per eseguire alcuni test dell'interfaccia utente. Vedo i browser visualizzati, ma non appena l'ultimo Task.Run() viene completato, tutte le interruzioni di esecuzione. Come si attivano i driver n in modo asincrono mentre si attende che vengano completati tutti prima di arrestare l'esecuzione?

Ho provato await Task.Run(() => HandleIntro(proxyDriver, target)); ma questo attende l'attività e non vengono eseguiti contemporaneamente.

HandleIntro:

private async Task HandleIntro(FirefoxDriver driver, string target) { 
    // do stuff 
} 
+0

È possibile utilizzare 'Task.WhenAll' su una serie di' Task's, e 'await' che. – Luaan

+0

Cerca in 'Task.WaitAll()'/'WhenAll()'. https://msdn.microsoft.com/en-us/library/dd270695%28v=vs.110%29.aspx –

risposta

6

E 'piuttosto semplice con async-await. Hai Task.WhenAll che a sua volta restituisce un awaitable che può essere in modo asincrono attese per tutti i compiti da completare:

[TestMethod] 
public async Task Start() 
{ 
    var numDrivers = 2; 
    List<Task> tasks = new List<Task>(); 

    while (numDrivers != 0) 
    { 
     var rnd = new Random(); 
     var r = rnd.Next(itemArray.Count); 

     var target = itemArray[r]; 
     var proxyDriver = GetProxiedDriver(); 

     tasks.Add(Task.Run(() => HandleIntro(proxyDriver, target))); 
     numDrivers--; 
    } 

    await Task.WhenAll(tasks); 
} 
+0

Hmm ... l'esecuzione si interrompe immediatamente anche con questo, il test passa non appena si avvia il primo – SB2055

+0

Forse viene lanciata un'eccezione all'interno di 'HandleIntro'? Impostare le eccezioni CLR su e vedere. –

+1

Sono un manichino, un errore nel digitare qualcosa. Grazie mille :) – SB2055

Problemi correlati