본문 바로가기
개발언어/C#

[C#] Queue, ConcurrentQueue 기본사용법

by 창용이랑 2021. 2. 17.
728x90

Thread에서 안전한 Queue인 ConcurrentQueue의 기본 사용법을 적어본다

 

1. Queue 선언.

 2. 값 삽입.

 3. 내용을 한번 확인 해보고,

 4. 값 가져오면서 큐 안의 내용을 삭제 한다.

 5. 가져오고 난 후의 큐 안의 갯 수를 확인해 보고,

 6. 마지막으로 큐 안의 값을 확인 하는 방법을 적어보고 

 

 끝~



출처: https://mongyang.tistory.com/117 [웃어라 온 세상이 너와 함께 웃을것이다.]

 

스레드 안전 ConcurrentQueue 컬렉션 사용

C# ConcurrentQueue는 스레드 세이프 퍼스트 인퍼스트 아웃(FIFO) 컬렉션이다. 다음 예제는 ConcurrentQueue를 사용하여 항목을 enque  dequeue하는 방법을 보여준다.

using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
 
class EnqueueDequeuePeek
{
    // Demonstrates:
    // ConcurrentQueue<T>.Enqueue()
    // ConcurrentQueue<T>.TryPeek()
    // ConcurrentQueue<T>.TryDequeue()
    static void Main()
    {
        //
        // Construct a ConcurrentQueue
        ConcurrentQueue<int> cq = new ConcurrentQueue<int>();
 
        //
        // Populate the queue.
        for (int i = 0; i < 10000; i++)
        {
            cq.Enqueue(i);
        }
 
        //
        // Peek at the first element
        int result;
        if (!cq.TryPeek(out result))
        {
            System.Console.WriteLine(
                "CQ: TryPeek failed when it should have succeeded");
        }
        else if (result != 0)
        {
            System.Console.WriteLine(
                "CQ: Expected TryPeek result of 0, got {0}", result);
        }
 
        //
        // An action to consume the ConcurrentQueue
        int outerSum = 0;
        Action action = () =>
        {
            int localSum = 0;
            int localValue;
            while (cq.TryDequeue(out localValue))
            {
                localSum += localValue;
            }
            Interlocked.Add(ref outerSum, localSum);
        };
 
        //
        // Start 4 concurrent consuming actions
        Parallel.Invoke(action, action, action, action);
 
        System.Console.WriteLine(
            "outerSum = {0}, should be 49995000", outerSum);
    }
}

출처  : https://jonlabelle.com/snippets/view/csharp/using-the-thread-safe-concurrentqueue-collection