การทำงานกับคอลเลกชันที่ปลอดภัยของเธรด: ConcurrentStack และ ConcurrentQueue

คอลเลกชันที่ปลอดภัยของเธรดถูกนำมาใช้ครั้งแรกใน. Net 4 ด้วยการแนะนำ System.Collections.Connamespace ชนิดคอลเลกชันใน System.Collections.Concurrent namespace ประกอบด้วยชุดของคลาสคอลเลกชันที่ปลอดภัย

ConcurrentStack

สแต็กคือโครงสร้างข้อมูลที่ทำงานบนพื้นฐาน LIFO (เข้าก่อนออกก่อน) คลาส ConcurrentStack เป็นคู่เธรดที่ปลอดภัยของคลาส Stack ทั่วไป ConcurrentStack เป็นคลาสคอลเลกชันทั่วไปที่ปลอดภัยสำหรับเธรดซึ่งถูกนำมาใช้ครั้งแรกโดยเป็นส่วนหนึ่งของ. Net Framework 4 นี่คือรายการวิธีการที่สำคัญของคลาสนี้ที่แสดงให้เห็นถึงการดำเนินการที่เป็นไปได้

  1. Push (องค์ประกอบ T) - วิธีนี้ใช้เพื่อเพิ่มข้อมูลประเภท T
  2. PushRange - วิธีนี้สามารถใช้เพื่อเพิ่มอาร์เรย์ของรายการประเภท T.
  3. TryPop (out T) - วิธีนี้ใช้เพื่อดึงองค์ประกอบแรกจากสแต็ก ผลตอบแทนที่เป็นจริงเมื่อประสบความสำเร็จเป็นอย่างอื่นเท็จ
  4. TryPeek (out T) - วิธีนี้ใช้เพื่อดึงองค์ประกอบถัดไปจากสแต็ก แต่ไม่ได้ลบองค์ประกอบออกจากสแต็ก โปรดทราบว่าคล้ายกับเมธอด TryPop (out T) ซึ่งจะส่งคืนจริงเมื่อสำเร็จและเป็นเท็จ
  5. TryPopRange - วิธีนี้ใช้งานมากเกินไปและทำงานคล้ายกับ TryPop แต่ใช้สำหรับการดึงอาร์เรย์จากสแต็ก

นี่คือวิธีที่คุณสามารถสร้างอินสแตนซ์ของคลาส ConcurrentStack และพุชข้อมูลไปที่มัน

ConcurrentStack concurrentStack = new ConcurrentStack();

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

{

       concurrentStack.Push(index);

}

ในการดึงองค์ประกอบออกจากสแต็กพร้อมกันคุณสามารถใช้ประโยชน์จากเมธอด TryPop (out T) ดังที่แสดงด้านล่าง

Int32 data;

bool success = concurrentStack.TryPop(out data);

รายการรหัสต่อไปนี้แสดงให้เห็นว่าคุณสามารถจัดเก็บและดึงข้อมูลเข้าและออกจากสแต็กพร้อมกันได้อย่างไร

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();

       }

เมื่อคุณดำเนินการตามรายการโค้ดด้านบนตัวเลข 0 ถึง 99 จะแสดงในลำดับย้อนกลับที่หน้าต่างคอนโซล

พร้อมกันคิว

คิวคือโครงสร้างข้อมูลที่ทำงานบนพื้นฐานของ FIFO (เข้าก่อนออกก่อน) คลาส ConcurrentQueue ใน. Net ทำหน้าที่เป็นเธรดที่ปลอดภัยตามคิวทั่วไป FIFO

ต่อไปนี้เป็นรายการวิธีการที่สำคัญในคลาส ConcurrentQueue

  1. Enqueue (องค์ประกอบ T) - วิธีนี้ใช้เพื่อเพิ่มรายการประเภท T ลงในคิว
  2. TryPeek (out T) - วิธีนี้ใช้เพื่อดึงองค์ประกอบถัดไปจากคิว แต่ไม่ได้ลบองค์ประกอบออกจากคิว วิธีนี้จะคืนค่าจริงเมื่อสำเร็จและเท็จเมื่อล้มเหลว
  3. TryDequeue (out T) - วิธีนี้ใช้เพื่อดึงองค์ประกอบแรกจากคิว ตรงกันข้ามกับวิธี TryPeek (out T) มันจะลบองค์ประกอบออกจากคิว วิธีนี้จะคืนค่าจริงเมื่อสำเร็จและเป็นเท็จ

ข้อมูลโค้ดต่อไปนี้จะแสดงวิธีสร้างอินสแตนซ์ของคลาส ConcurrentQueue เพื่อเก็บจำนวนเต็ม

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

ในการจัดเก็บองค์ประกอบไปยังอินสแตนซ์คิวพร้อมกันคุณสามารถใช้ประโยชน์จากวิธี Enqueue ดังที่แสดงด้านล่าง

concurrentQueue.Enqueue(100);

รายการรหัสต่อไปนี้แสดงให้เห็นถึงวิธีที่คุณสามารถจัดเก็บและดึงองค์ประกอบเข้าและออกจากคิวพร้อมกัน

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

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

{

     concurrentQueue.Enqueue(index);

}

Int32 item;

while (concurrentQueue.TryDequeue(out item))

{

     Console.WriteLine(item);

}

เมื่อคุณดำเนินการตามรายการโค้ดด้านบนตัวเลข 0 ถึง 99 จะแสดงที่หน้าต่างคอนโซล

โปรดทราบว่าทั้งคลาส ConcurrentStack และ ConcurrentQueue เป็นเธรดที่ปลอดภัยและสามารถจัดการปัญหาการล็อกและการซิงโครไนซ์ภายในได้

คุณยังสามารถแปลงอินสแตนซ์คิวพร้อมกันเป็นอาร์เรย์ได้ด้วยการโทรไปยังเมธอด ToArray () ข้อมูลโค้ดต่อไปนี้แสดงให้เห็นว่าสามารถทำได้อย่างไร

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);

}

คุณสมบัติ IsEmpty ของคลาส ConcurrentQueue ส่งกลับ true คือคอลเลกชันว่างเปล่าเป็นอย่างอื่น ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้วิธีนี้

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);

}