Saya baru saja belajar tentang pustaka Threading dan Paralel baru di .Net 4
Di masa lalu saya akan membuat Thread baru seperti itu (sebagai contoh):
DataInThread = new Thread(new ThreadStart(ThreadProcedure));
DataInThread.IsBackground = true;
DataInThread.Start();
Sekarang saya bisa melakukan:
Task t = Task.Factory.StartNew(() =>
{
ThreadProcedure();
});
Apa bedanya jika ada?
Terima kasih
Jawaban:
Ada perbedaan besar. Tugas dijadwalkan di ThreadPool dan bahkan dapat dijalankan secara sinkron jika sesuai.
Jika Anda memiliki pekerjaan latar belakang yang berjalan lama, Anda harus menentukan ini dengan menggunakan Opsi Tugas yang benar.
Anda sebaiknya lebih memilih Task Parallel Library daripada penanganan utas eksplisit, karena ini lebih dioptimalkan. Anda juga memiliki lebih banyak fitur seperti Kelanjutan.
sumber
Tugas memberi Anda semua kebaikan API tugas:
Task.ContinueWith
)Perhatikan bahwa dalam kedua kasus, Anda dapat membuat kode Anda sedikit lebih sederhana dengan konversi grup metode:
sumber
Thread
tingkat yang sangat rendah dibandingkan denganTask
(Saya memiliki posting blog yang menjelaskan secara rinci). Saya memberikan ceramah tentang "menggunakan Tasks di dunia nyata" di Grand Rapids DevDay . Pembicaraan ini disebut "Thread is Dead", karena tidak diperlukan lagiThread
(kecuali Anda mengimplementasikan aTaskScheduler
).Thread
sudah mati, saat digunakan sebagai thread latar belakang?Thread
bisa dilakukan (atauBackgroundWorker
) yang tidak bisa dilakukan dengan lebih eleganTask
dan pantasTaskScheduler
.Thread
?Task
dijalankan pada utas tertentu, gunakan yang sesuaiTaskScheduler
- misAsyncContextThread
. , . Namun, ini biasanya tidak perlu; ituSynchronizationContext
,,ThreadPool
danConcurrentExclusiveSchedulerPair
penjadwal cukup untuk sebagian besar program.Dalam kasus pertama Anda hanya memulai utas baru sementara dalam kasus kedua Anda masuk ke kumpulan utas.
Tugas kumpulan utas adalah membagikan dan mendaur ulang utas. Ini memungkinkan untuk menghindari kehilangan beberapa milidetik setiap kali kita perlu membuat utas baru.
Ada beberapa cara untuk memasuki kumpulan utas:
sumber
Blok kode pertama Anda memberi tahu CLR untuk membuat Thread (katakanlah. T) untuk Anda yang dapat dijalankan sebagai latar belakang (gunakan thread pool thread saat menjadwalkan T). Singkatnya, Anda secara eksplisit meminta CLR untuk membuat utas agar Anda melakukan sesuatu dan memanggil metode Start () pada utas untuk memulai.
Blok kode kedua Anda melakukan hal yang sama tetapi mendelegasikan (secara implisit menyerahkan) tanggung jawab untuk membuat utas (latar belakang- yang lagi-lagi berjalan di kumpulan utas) dan utas awal melalui metode StartNew dalam implementasi Pabrik Tugas.
Ini adalah perbedaan cepat antara blok kode yang diberikan. Karena itu, ada beberapa perbedaan mendetail yang dapat Anda gunakan di google atau lihat jawaban lain dari rekan kontributor saya.
sumber