Leo

Visual Studio C# 關於我寫 multi-thread 的起手式:Thread、ManualResetEvent、ConcurrentQueue

private static System.Collections.Concurrent.ConcurrentQueue<byte[]> _fifo = null;
private static System.Threading.ManualResetEvent _pauseEvent = null;
private static System.Threading.Thread _thread = null;

/// <summary>
/// 使用 Thread 創建多執行緒避免鎖住 UI
/// 使用 ManualResetEvent 控制 執行緒的運作
/// 使用 ConcurrentQueue 令多執行緒可以安全的共用資料
/// </summary>
/// <param name="args"></param>
private static void Main(string[] args)
{
    _thread = new System.Threading.Thread(MyThreadMethod);                  // 初始化 "Thread"
    _pauseEvent = new System.Threading.ManualResetEvent(false);             // 初始化 "ManualResetEvent" 並預設為 暫停 (false)
    _fifo = new System.Collections.Concurrent.ConcurrentQueue<byte[]>();    // 初始化 "安全執行緒的先進先出 (FIFO) 集合"

    _thread.Start();

    Task.Factory.StartNew(MyTestMethod);

READ_CMD:
    var ck = Console.ReadKey(true);
    if (ck.Key == ConsoleKey.S)
    {
        _pauseEvent.Set();  // 釋放 "ManualResetEvent"
    }
    else if (ck.Key == ConsoleKey.R)
    {
        _pauseEvent.Reset(); // 鎖住 "ManualResetEvent"
    }
    goto READ_CMD;
}

private static void MyTestMethod()
{
    do
    {
        _pauseEvent.WaitOne(System.Threading.Timeout.Infinite);
        var result = _fifo.TryDequeue(out var array);
        if (result && array != null)
        {
            Console.Write($"{nameof(array)}: ");
            for (var idx = 0; idx < array.Length; idx++)
            {
                Console.Write($"{array[idx]} ");
            }
        }
        Console.WriteLine();
        System.Threading.Thread.Sleep(800);
    } while (true);
}

private static void MyThreadMethod()
{
    var random = new Random();
    do
    {
        _pauseEvent.WaitOne(System.Threading.Timeout.Infinite);
        var array = new byte[10];
        random.NextBytes(array);
        _fifo.Enqueue(array);
        Console.Write($"{nameof(array)}: ");
        for (var idx = 0; idx < array.Length; idx++)
        {
            Console.Write($"{array[idx]} ");
        }
        Console.WriteLine();
        System.Threading.Thread.Sleep(500);
    } while (true);
}

原文連結Leo Studio

Like my work??
Don't forget to support or like, so I know you are with me..

CC BY-NC-ND 2.0

Want to read more ?

Login with one click and join the most diverse creator community.