2015-04-16 9 views
7

Sto utilizzando task factory per generare thread paralleli e il mio codice è il seguente. Ho l'obbligo di stampare il tempo di completamento di ogni thread ma non so come controllare ogni thread. Attualmente il mio codice è in attesa del completamento di tutte le attività e quindi del calcolo dell'ora.che memorizza il tempo di completamento dell'attività di ogni attività utilizzando Task factory

stp1.Start(); 
     for (int i = 0; i < tsk.Length; i++) 
     { 
      tsk[i] = Task.Factory.StartNew((object obj) => 
      { 
       resp = http.SynchronousRequest(web, 443, true, req); 
      }, i); 
     } 
     try 
     { 
      Task.WaitAll(tsk); 
     } 
     stp1.Stop(); 

risposta

7

È possibile aggiungere una continuazione allo Task. La continuazione è un metodo che verrà chiamato quando il dato Task è completato.

for (int i = 0; i < tsk.Length; i++) 
{ 
    tsk[i] = Task.Factory.StartNew((object obj) => 
    { 
     resp = http.SynchronousRequest(web, 443, true, req); 
    }, i); 

    tsk[i].ContinueWith(antecedent=> 
    { 
     //antecedent is completed 
     //Do whatever here     
    }); 
} 

Se è necessario pianificare le singole attività, è necessario un cronometro per attività. È possibile avviare StopWatch all'interno di StartNew e interromperlo in ContinueWith.

Se questo è il codice effettivo, è possibile semplicemente impostare l'ora dell'operazione sincrona invocata (http.SynchronousRequest in questo caso). Ad esempio il codice seguente è sufficiente.

for (int i = 0; i < tsk.Length; i++) 
{ 
    tsk[i] = Task.Factory.StartNew((object obj) => 
    { 
     StopWatch watch = StopWatch.StartNew(); 

     resp = http.SynchronousRequest(web, 443, true, req); 

     watch.Stop(); 
     Console.WriteLine(watch.Elapsed); 
    }, i); 
} 

Btw, le operazioni di rete sono intrinsecamente asincrone; Ci sarà un'API asincrona disponibile, puoi usarla invece di avvolgere una richiesta web sincrona in Attività. Ad esempio, forse HttpClient.SendAsync.

1

Inizierei dicendo che non sono necessari i thread del threadpool per eseguire operazioni associate all'IO async. Invece di utilizzare Task.Factory.StartNew, utilizzare, ad esempio, le API asincrone naturali come quella delle offerte HttpClient.

Quindi, direi che è possibile utilizzare Task.WhenAny di attendere il completamento di ciascuno dei vostri compiti come finiscono:

// Note I'm assuming some kind of async implementation which returns a Task<T> 
var tasks = tsk.Select(req => http.AsyncRequest(web, 443, true, req)); 

while (tasks.Count > 0) 
{ 
    var finishedTask = await Task.WhenAny(tasks); 
    // Do something with finishedTask 

    tasks.Remove(finishedTask); 
} 
Problemi correlati