2012-01-30 9 views
10

Sto ricercando l'utilizzo della libreria parallela Task per un progetto di lavoro che sto facendo e voglio comprendere i vantaggi/gli svantaggi delle attività di lunga durata. Non ho ancora un esempio di vita reale, voglio solo capire la teoria alla base di questo.Attività Libreria parallela - Attività LongRunning vs Multiple Continuations

Da ciò che le pagine MSDN dicono su task schedulers e questo SO question, sembrerebbe come se fosse meglio evitare il più possibile le attività a esecuzione prolungata in modo che non si stiano creando thread al di fuori del ThreadPool. Ma dire che ha avuto un compito che stava andando a prendere un lungo periodo di tempo per completare, invece di questo:

Task.Factory.StartNew(() => DoTimeConsumingWork(), TaskCreationOptions.LongRunning) 

Potrebbe cercare di dividere il lavoro in piccoli, unità più veloci di lavoro e utilizzare continuazioni attività, come questo:

Task.Factory 
    .StartNew(() => DoWorkPart1()) 
    .ContinueWith(t => DoWorkPart2()) 
    .ContinueWith(t => DoWorkPart3()) 
    //...etc 

sarebbe questo approccio sia più utile o è eccessivo per quello che sta cercando di raggiungere?

+0

Dipende davvero da cosa intendi per * lungo *. –

risposta

5

sembrerebbe come se fosse meglio evitare attività di lunga durata il più possibile

Non completamente corretto. Se ne hai bisogno, dovrai creare/allocare un thread in qualche modo e quindi l'opzione Task con LongRunning è probabilmente la scelta migliore. Il flag informa semplicemente lo scheduler che l'operazione potrebbe richiedere un po 'di tempo in modo che lo scheduler possa anticipare. Potrebbe persino ignorare l'opzione.

Potrebbe cercare di dividere il lavoro in piccoli gruppi, più veloce di lavoro un

Se è possibile, allora fatelo. Ma non tutti sono così facilmente separati.

+0

Concordo sul fatto che non tutti gli algoritmi possono essere suddivisi molto facilmente in blocchi più piccoli. Ma se potessi, sarebbe meglio farlo? Immagino che utilizzerebbe il TPL meglio dello scheduler che crea un altro thread, sono corretto? –

+0

Potrebbe essere migliore, ma non è sicuro. Di solito non mi preoccuperei troppo. Non puoi (non puoi) sapere se porta a un thread aggiuntivo. –

3

Se si specifica TaskCreationOptions.LongRunning, per lo più assegna un thread dedicato dall'esterno del pool di thread.

vorrei suggerire semplicemente andare per classe BackgroundWorker che si assicura il vostro compito a lungo in esecuzione verrà riceve un thread dedicato separata invece di un filo dal pool di thread

+1

TaskCreationOptions.LongRunning di solito causa la creazione di un thread dedicato. – dtb

Problemi correlati