Bekerja dengan koleksi benang yang selamat: ConcurrentStack dan ConcurrentQueue

Koleksi benang selamat mula diperkenalkan di .Net 4 dengan pengenalan System.Collections.Conturrent namespace. Jenis koleksi di ruang nama System.Collections.Currurrent mengandungi koleksi kelas koleksi benang selamat.

Bersama Bersama

Tumpukan adalah struktur data yang berfungsi berdasarkan LIFO (last in first out). Kelas ConcurrentStack adalah rakan sejajar kelas Stack generik. The ConcurrentStack adalah kelas koleksi generik yang selamat untuk benang yang pertama kali diperkenalkan sebagai sebahagian daripada .Net Framework 4. Berikut adalah senarai kaedah penting kelas ini yang menggambarkan kemungkinan operasi.

  1. Push (elemen T) - kaedah ini digunakan untuk menambahkan data jenis T.
  2. PushRange - kaedah ini boleh digunakan untuk menambahkan susunan item jenis T.
  3. TryPop (keluar T) - kaedah ini digunakan untuk mengambil elemen pertama dari timbunan. Ia kembali benar pada kejayaan, salah sebaliknya.
  4. TryPeek (keluar T) - kaedah ini digunakan untuk mengambil elemen seterusnya dari timbunan tetapi tidak mengeluarkan elemen dari timbunan. Perhatikan bahawa serupa dengan kaedah TryPop (keluar T), ia akan kembali benar pada kejayaan dan sebaliknya.
  5. TryPopRange - kaedah ini berlebihan dan berfungsi serupa dengan TryPop tetapi digunakan untuk mengambil susunan dari timbunan

Inilah cara anda dapat membuat contoh kelas ConcurrentStack dan mendorong data ke dalamnya.

ConcurrentStack concurrentStack = new ConcurrentStack();

for (Int32 index = 0; index < 10; index++)

{

       concurrentStack.Push(index);

}

Untuk mengambil elemen dari tumpukan serentak, anda dapat memanfaatkan kaedah TryPop (out T) seperti yang ditunjukkan di bawah.

Int32 data;

bool success = concurrentStack.TryPop(out data);

Senarai kod berikut menggambarkan bagaimana anda dapat menyimpan dan mengambil data ke dan dari timbunan serentak.

static void Main(string[] args)

       {

           ConcurrentStack concurrentStack = new ConcurrentStack();

           for (Int32 index = 0; index < 100; index++)

           {

               concurrentStack.Push(index);

           }

           while (concurrentStack.Count > 0)

           {

               Int32 data;

               bool success = concurrentStack.TryPop(out data);

               if (success)

              {

                   Console.WriteLine(data);

               }

           }

           Console.Read();

       }

Apabila anda menjalankan penyenaraian kod di atas, angka 0 hingga 99 akan dipaparkan dalam urutan terbalik di tetingkap konsol.

Bersamaan Bersamaan

Antrian adalah struktur data yang berfungsi berdasarkan FIFO (first in first out). Kelas ConcurrentQueue di .Net berfungsi sebagai barisan generik berasaskan FIFO yang selamat.

Berikut adalah senarai kaedah penting dalam kelas ConcurrentQueue.

  1. Enqueue (elemen T) - kaedah ini digunakan untuk menambahkan item jenis T ke dalam barisan
  2. TryPeek (keluar T) - kaedah ini digunakan untuk mengambil elemen seterusnya dari barisan tetapi tidak mengeluarkan elemen dari barisan. Kaedah ini kembali benar pada kejayaan dan salah apabila gagal.
  3. TryDequeue (keluar T) - kaedah ini digunakan untuk mengambil elemen pertama dari barisan. Berbeza dengan kaedah TryPeek (keluar T), ia menghilangkan elemen dari barisan. Kaedah ini kembali benar pada kejayaan dan salah sebaliknya.

Coretan kod berikut menunjukkan bagaimana anda boleh membuat contoh kelas ConcurrentQueue untuk menyimpan bilangan bulat.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

Untuk menyimpan elemen ke contoh antrian serentak, anda boleh memanfaatkan kaedah Enqueue seperti yang ditunjukkan di bawah.

concurrentQueue.Enqueue(100);

Senarai kod berikut menggambarkan bagaimana anda dapat menyimpan dan mengambil elemen ke dan dari barisan serentak.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

for (int index = 0; index < 100; index++)

{

     concurrentQueue.Enqueue(index);

}

Int32 item;

while (concurrentQueue.TryDequeue(out item))

{

     Console.WriteLine(item);

}

Apabila anda melaksanakan senarai kod di atas, angka 0 hingga 99 akan dipaparkan di tetingkap konsol.

Perhatikan bahawa kedua-dua kelas ConcurrentStack dan ConcurrentQueue adalah selamat di thread dan mereka dapat menguruskan masalah penguncian dan penyegerakan secara dalaman.

Anda juga dapat menukar contoh antrian serentak ke array dengan membuat panggilan ke kaedah ToArray (). Coretan kod berikut menggambarkan bagaimana ini dapat dicapai.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

for (Int32 index = 0; index < 100; index++ )

   concurrentQueue.Enqueue(index);

Int32[] integerArray = concurrentQueue.ToArray();

foreach (int i in integerArray)

{

   Console.WriteLine(i);

}

Harta IsEmpty kelas ConcurrentQueue kembali benar ialah koleksi kosong, palsu sebaliknya. Coretan kod berikut menunjukkan bagaimana anda boleh menggunakan kaedah ini.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

for (Int32 index = 0; index < 100; index++ )

concurrentQueue.Enqueue(index);

while(!concurrentQueue.IsEmpty)

{

     Int32 result;

     concurrentQueue.TryDequeue(out result);

     Console.WriteLine(result);

}