Saya baru saja melihat 3 rutinitas mengenai penggunaan TPL yang melakukan pekerjaan yang sama; ini kodenya:
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Create a task and supply a user delegate by using a lambda expression.
Task taskA = new Task( () => Console.WriteLine("Hello from taskA."));
// Start the task.
taskA.Start();
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Define and run the task.
Task taskA = Task.Run( () => Console.WriteLine("Hello from taskA."));
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Better: Create and start the task in one operation.
Task taskA = Task.Factory.StartNew(() => Console.WriteLine("Hello from taskA."));
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
Aku hanya tidak mengerti mengapa MS memberikan 3 cara yang berbeda untuk menjalankan pekerjaan di TPL karena mereka semua bekerja sama: Task.Start()
, Task.Run()
dan Task.Factory.StartNew()
.
Katakan, apakah Task.Start()
, Task.Run()
dan Task.Factory.StartNew()
semua digunakan untuk tujuan yang sama atau apakah mereka memiliki arti yang berbeda?
Kapan sebaiknya satu digunakan Task.Start()
, kapan harus digunakan Task.Run()
dan kapan harus digunakan Task.Factory.StartNew()
?
Tolong bantu saya untuk memahami penggunaan sebenarnya sesuai skenario dengan sangat detail dengan contoh, terima kasih.
Task.Run
- mungkin ini akan menjawab pertanyaan Anda;)Task.Start
sebenarnya berguna.Jawaban:
Task.Run
adalah singkatan untukTask.Factory.StartNew
dengan argumen aman tertentu:Itu ditambahkan di. Net 4.5 untuk membantu dengan semakin seringnya penggunaan
async
dan pembongkaran pekerjaan ke InternetThreadPool
.Task.Factory.StartNew
(ditambahkan dengan TPL di .Net 4.0) jauh lebih kuat. Anda hanya boleh menggunakannya jikaTask.Run
tidak cukup, misalnya ketika Anda ingin menggunakanTaskCreationOptions.LongRunning
(meskipun itu tidak perlu ketika delegasi adalah async. Lebih lanjut tentang itu di blog saya: LongRunning Tidak Berguna Untuk Tugas. Berjalanlah dengan async-tunggu ). Lebih lanjut tentangTask.Factory.StartNew
di Task.Run vs Task.Factory.StartNewJangan pernah membuat
Task
dan meneleponStart()
kecuali Anda menemukan alasan yang sangat bagus untuk melakukannya. Seharusnya hanya digunakan jika Anda memiliki beberapa bagian yang perlu membuat tugas tetapi tidak menjadwalkannya dan bagian lain yang menjadwalkan tanpa membuat. Itu hampir tidak pernah merupakan solusi yang tepat dan bisa berbahaya. Lebih banyak di "Task.Factory.StartNew" vs "Task baru (...). Mulai"Kesimpulannya, sebagian besar menggunakan
Task.Run
, gunakanTask.Factory.StartNew
jika Anda harus dan tidak pernah menggunakannyaStart
.sumber
Task.Start
memiliki tempat untuk jenis warisan sebagian besar.Jawaban singkat :
Jika Anda tidak menggunakan tugas anak-anak bersarang dan selalu ingin tugas Anda dieksekusi di Thread Pool , lebih baik digunakan
Task.Run
.Jawaban panjang:
Task.Run
danTask.Factory.StartNew
keduanya memberikan dukungan untuk membuat dan menjadwalkan objek Tugas sehingga kita tidak perlu membuatTask
dan memanggilStart()
Setara dengan:
Dan
Setara dengan:
Task.Run
menggunakanTaskCreationOptions.DenyChildAttach
yang berarti bahwa tugas anak-anak tidak dapat dilampirkan ke orang tua dan itu menggunakanTaskScheduler.Default
yang berarti bahwa yang menjalankan tugas di Thread Pool akan selalu digunakan untuk menjalankan tugas.Task.Factory.StartNew
menggunakanTaskScheduler.Current
yang berarti penjadwal utas saat ini, mungkinTaskScheduler.Default
tapi tidak selalu.sumber