Il secondo metodo, Task.Run
è stato introdotto in una versione successiva di .NET framework (in .NET 4.5).
Tuttavia, il primo metodo, Task.Factory.StartNew
ti dà l'opportunità di definire molte cose utili sul thread che vuoi creare, mentre Task.Run
non lo fornisce.
Ad esempio, supponiamo che tu voglia creare un thread di attività di lunga durata. Se un thread del pool di thread verrà utilizzato per questa attività, questo potrebbe essere considerato un abuso del pool di thread.
Una cosa che potresti fare per evitare ciò sarebbe quella di eseguire l'attività in un thread separato. Un thread appena creato che sarebbe dedicato a questa attività e verrebbe distrutto una volta completata l'attività. Non puoi farlo con il Task.Run
, mentre puoi farlo con il Task.Factory.StartNew
, come di seguito:
Task.Factory.StartNew(..., TaskCreationOptions.LongRunning);
Come indicato qui :
Pertanto, in .NET Framework 4.5 Developer Preview, abbiamo introdotto il nuovo metodo Task.Run. Ciò non oscura in alcun modo Task.Factory.StartNew,
ma piuttosto dovrebbe essere semplicemente considerato un modo rapido per usare
Task.Factory.StartNew senza dover specificare un mucchio di parametri. È una scorciatoia. Infatti, Task.Run è effettivamente implementato in termini della stessa logica utilizzata per Task.Factory.StartNew, passando solo alcuni parametri predefiniti. Quando passi un'azione a Task.Run:
Task.Run(someAction);
è esattamente equivalente a:
Task.Factory.StartNew(someAction,
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
StartNew
per impostazione predefinitaTaskScheduler.Current
che può essere il pool di thread ma potrebbe anche essere il thread dell'interfaccia utente.