Itu pemrograman komputer istilah "utas" adalah kependekan dari utas eksekusi, di mana prosesor mengikuti jalur yang ditentukan melalui kode Anda. Konsep mengikuti lebih dari satu utas sekaligus memperkenalkan subjek multi-tasking dan multi-threading.
Aplikasi memiliki satu atau lebih proses di dalamnya. Pikirkan proses sebagai program yang berjalan di komputer Anda. Sekarang setiap proses memiliki satu atau lebih utas. Aplikasi game mungkin memiliki utas untuk memuat sumber daya dari disk, yang lain untuk melakukan AI, dan yang lain untuk menjalankan game sebagai server.
Di .NET / Windows, sistem operasi mengalokasikan waktu prosesor ke utas. Setiap utas melacak penangan pengecualian dan prioritas di mana ia berjalan, dan ia memiliki tempat untuk menyimpan konteks utas sampai berjalan. Konteks utas adalah informasi yang diperlukan utas untuk melanjutkan.
Multi-Penugasan Dengan Utas
Utas memakan sedikit memori dan membuatnya membutuhkan sedikit waktu, jadi biasanya, Anda tidak ingin menggunakan banyak. Ingat, mereka bersaing untuk waktu prosesor. Jika komputer Anda memiliki beberapa CPU, maka Windows atau .NET mungkin menjalankan setiap utas pada CPU yang berbeda, tetapi jika beberapa utas berjalan pada CPU yang sama, maka hanya satu yang dapat aktif pada satu waktu dan pergantian utas membutuhkan waktu waktu.
CPU menjalankan utas untuk beberapa juta instruksi, dan kemudian beralih ke utas lainnya. Semua register CPU, titik eksekusi program saat ini dan tumpukan harus disimpan di suatu tempat untuk utas pertama dan kemudian dikembalikan dari tempat lain untuk utas berikutnya.
Membuat Thread
Di Sistem namespace. Threading, Anda akan menemukan jenis utas. Utas konstruktor (ThreadStart) membuat turunan dari sebuah utas. Namun, baru-baru ini C # kode, itu lebih cenderung lulus dalam ekspresi lambda yang memanggil metode dengan parameter apa pun.
Jika Anda tidak yakin ekspresi lambda, mungkin perlu memeriksa LINQ.
Berikut adalah contoh utas yang dibuat dan dimulai:
menggunakan Sistem;
menggunakan Sistem. Threading;
namespace ex1
{
Program kelas
{
public static void Write1 ()
{
Menghibur. Tulis ('1');
Benang. Tidur (500);
}
static void Main (string [] args)
{
var task = new Thread (Write1);
tugas. Mulailah() ;
untuk (var i = 0; saya <10; i ++)
{
Menghibur. Tulis ('0');
Menghibur. Tulis (tugas. Hidup? 'A': 'D');
Benang. Tidur (150);
}
Menghibur. Kunci Baca() ;
}
}
}
Semua contoh ini lakukan adalah menulis "1" ke konsol. Utas utama menulis "0" ke konsol 10 kali, setiap kali diikuti oleh "A" atau "D" tergantung pada apakah utas lainnya masih Hidup atau Mati.
Utas lainnya hanya berjalan sekali dan menulis "1." Setelah jeda setengah detik pada utas Write1 (), utas selesai, dan Tugas. IsAlive di loop utama sekarang mengembalikan "D."
Thread Pool dan Task Parallel Library
Alih-alih membuat utas Anda sendiri, kecuali jika Anda benar-benar perlu melakukannya, gunakan Thread Pool. Dari .NET 4.0, kami memiliki akses ke Perpustakaan Tugas Paralel (TPL). Seperti pada contoh sebelumnya, sekali lagi kita perlu sedikit LINQ, dan ya, itu semua ekspresi lambda.
Tugas menggunakan Pool Utas di belakang layar tetapi lebih baik menggunakan utas tergantung pada jumlah yang digunakan.
Objek utama dalam TPL adalah Tugas. Ini adalah kelas yang mewakili operasi asinkron. Cara paling umum untuk mulai menjalankan sesuatu adalah dengan Tugas. Pabrik. StartNew seperti pada:
Tugas. Pabrik. StartNew (() => DoSomething ());
Di mana DoSomething () adalah metode yang dijalankan. Dimungkinkan untuk membuat tugas dan tidak langsung menjalankannya. Dalam hal ini, cukup gunakan Tugas seperti ini:
var t = Tugas baru (() => Konsol. WriteLine ("Halo"));
...
t. Mulailah();
Itu tidak memulai utas sampai. Mulai () dipanggil. Dalam contoh di bawah ini, ada lima tugas.
menggunakan Sistem;
menggunakan Sistem. Threading;
menggunakan Sistem. Threading. Tugas;
namespace ex1
{
Program kelas
{
public static void Write1 (int i)
{
Menghibur. Tulis (i);
Benang. Tidur (50);
}
static void Main (string [] args)
{
untuk (var i = 0; saya <5; i ++)
{
nilai var = i;
var runningTask = Tugas. Pabrik. StartNew (() => Write1 (nilai));
}
Menghibur. Kunci Baca() ;
}
}
}
Jalankan itu dan Anda mendapatkan angka 0 hingga 4 output dalam beberapa urutan acak seperti 03214. Itu karena urutan pelaksanaan tugas ditentukan oleh .NET.
Anda mungkin bertanya-tanya mengapa nilai var = i diperlukan. Coba hapus dan panggil Tulis (i), dan Anda akan melihat sesuatu yang tidak terduga seperti 55555. Kenapa ini? Itu karena tugas menunjukkan nilai i pada saat tugas dieksekusi, bukan ketika tugas itu dibuat. Dengan membuat yang baru variabel setiap kali dalam loop, masing-masing dari lima nilai disimpan dan diambil dengan benar.