2013-05-11 17 views
6

Perché il valore predefinito per CreationOptions di un Task creata usando Task.Run è DenyChildAttach piuttosto che None?TaskCreationOptions predefinite in Task.Run

Ha qualcosa a che fare con il fatto di semplificare il lavoro con il nuovo async e await in C# 5.0 (impedendo all'utente di sfuggire all'utilità di pianificazione corrente del contesto corrente?)?

risposta

7

Stephen Toub spiega questo bene in his blog post on the subject.

Parent and child tasks sono un po 'comuni quando si utilizza Task s in modo parallelo. Si noti che quando un genitore Task ha un figlio, la semantica di completamento del genitore cambia in modo subdolo.

Le attività padre/figlio non vengono quasi mai utilizzate quando si utilizza Task s in modo async. Nel mondo async, si ha una sorta di "relazione genitore/figlio logica" quando un metodo async ne chiama un altro, ma non viene effettivamente implementato utilizzando attività padre/figlio.

In genere un Task destinato per l'uso nel codice async non si prevede che la semantica di completamento venga modificata da un'attività secondaria ad essa allegata. Pertanto, il nuovo valore predefinito per Task.Run è DenyChildAttach, che impedisce a qualsiasi attività figlio di tentare di collegarsi.

3

Perché il valore predefinito per CreationOptions di un'attività creata usando Task.Run è DenyChildAttach piuttosto che Nessuno?

Non vi sono opzioni (predefinite o altro) nella creazione di un'attività utilizzando Task.Run Method.

Citando da Task.Run vs Task.Factory.StartNew (by Stephen Toub - MSFT):

  • Task.Run "dovrebbe essere semplicemente pensato come un modo rapido per utilizzare Task.Factory.StartNew senza bisogno di specificare una serie di parametri E 'una scorciatoia."
  • Task.Run(someAction); è esattamente equivalente a:

    Task.Factory.StartNew 
        ( someAction 
         , CancellationToken.None 
         , TaskCreationOptions.DenyChildAttach 
         , TaskScheduler.Default 
        ); 
    
  • "In questo modo, Task.Run può e deve essere utilizzato per i casi più comuni"

MSDN articolo Nested Tasks and Child Tasks (for .NET 4.0, vale a dire senza alcun equivokes per C# 5.0/.NET 4.5) afferma:

"nella maggior parte degli scenari, si consiglia di utilizzare le attività nidificati perché i rapporti con le altre attività sono meno complesso. È per questo che le attività create all'interno di altri compiti sono annidati per impostazione predefinita, e si deve specificare esplicitamente l'opzione AttachedToParent per creare un'attività figlio"

il che spiega il motivo per cui CreationOptions.DenyChildAttach è stato scelto per l'opzione più comune e più semplice del collegamento.