2012-09-18 20 views
6

ho "Googled", ma ancora confuso con Task, Filo, e dei lavoratori Sfondo .....C#/VB.Net Task vs Discussione vs BackgroundWorker

  1. Is "Task è un'API di alto livello che in esecuzione sul thread corrente "corretto?

  2. Se 1 è corretto, perché è necessario utilizzare invoke per modificare l'interfaccia utente all'interno dell'attività con lo stesso thread?

  3. Backgroundworker ha ottenuto la priorità più bassa nell'applicazione? Quindi le prestazioni di backgroundworker sono inferiori a task e thread? Destra ?

  4. Infine, nella mia applicazione ho bisogno di ottenere una stringa dal server utilizzando "HttpWebRequest", dopo che analizzare la stringa e aggiornare l'interfaccia utente. Se utilizzo "HttpWebRequest.BeginGetResponse" per attendere il risultato asincrono e attivare un evento completo per aggiornare l'interfaccia utente, è necessario utilizzare il metodo invoke per richiamare il controllo del thread dell'interfaccia utente, ma è possibile utilizzare l'attività di background anziché? Posso semplicemente cambiare l'interfaccia utente in evento "RunWorkerCompleted", ci sono degli svantaggi?

Siamo spiacenti per la mia piscina inglese e grazie per l'aiuto ...!

+0

Le attività utilizzano il threadPool dietro le quinte, non sono limitate al thread corrente che le richiama –

risposta

4

1) No, un'attività viene eseguita per impostazione predefinita su un thread del pool di thread. È possibile fornire un altro programma di pianificazione che può eseguire attività in modo diverso, però.

3) Per impostazione predefinita non vi sono differenze di priorità. BackgroundWorker viene eseguito anche su un thread pool di thread.

4) Usando TaskFactory.FromAsync è un modo piuttosto semplice per gestire le richieste web asincrone:

Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null) 
    .ContinueWith(
     t => 
     { 
      using (var response = (HttpWebResponse)t.Result) 
      { 
       // Do your work 
      } 
     }, 
     TaskScheduler.FromCurrentSynchronizationContext() 
    ); 

Uso TaskScheduler.FromCurrentSynchronizationContext assicura che il callback in ContinueWith viene richiamato nel thread corrente. Pertanto, se l'attività viene creata sul thread dell'interfaccia utente, la risposta verrà recuperata in background e quindi elaborata sul thread dell'interfaccia utente.

Problemi correlati