Il secondo metodo, Task.Run
, è stato introdotto in una versione successiva del framework .NET (in .NET 4.5).
Tuttavia, il primo metodo, Task.Factory.StartNew
, offre la possibilità di definire molte cose utili sul thread che si desidera creare, mentre Task.Run
non fornisce questo.
Ad esempio, diciamo che si desidera creare un thread di attività a esecuzione prolungata. 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 si potrebbe fare per evitare questo sarebbe di eseguire l'attività in un thread separato. Una discussione appena creata che sarebbe stata dedicata a questa attività e sarebbe stata distrutta una volta completata l'attività. È Non possibile raggiungere questo obiettivo con la Task.Run
, mentre è possibile farlo con il Task.Factory.StartNew
, come di seguito:
Task.Factory.StartNew(..., TaskCreationOptions.LongRunning);
Come si afferma here:
Così, in .NET Framework 4.5 Developer Preview, abbiamo introdotto il nuovo metodo Task.Run . Ciò non obsoletes Task.Factory.StartNew, ma piuttosto dovrebbe semplicemente essere pensato come un modo rapido per utilizzare Task.Factory.StartNew senza bisogno di specificare un gruppo di parametri. È una scorciatoia. In effetti, Task.Run è in realtà implementato in termini della stessa logica utilizzata per Task.Factory.StartNew, passando solo alcuni parametri predefiniti. Quando si passa un'azione a attività.Run:
Task.Run(someAction);
che è esattamente equivalente a:
Task.Factory.StartNew(someAction,
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
In realtà, StartNew non deve utilizzare il ThreadPool, vedere il blog a cui mi sono collegato nella mia risposta. Il problema è 'StartNew' di default usa' TaskScheduler.Current' che potrebbe essere il pool di thread ma potrebbe anche essere il thread dell'interfaccia utente. –
Possibile duplicato di [Informazioni sull'utilizzo di Task.Start(), Task.Run() e Task.Factory.StartNew()] (https://stackoverflow.com/questions/29693362/regarding-usage-of-task-start -task-run-and-task-factory-startnew) –