c# autoresetevent的使用案例有哪些

c#
小樊
81
2024-11-18 09:54:06

AutoResetEvent 是 C# 中一個(gè)非常有用的同步原語(yǔ),它允許一個(gè)或多個(gè)線程等待,直到另一個(gè)線程發(fā)出信號(hào)為止。AutoResetEvent 在某些場(chǎng)景下非常有用,比如生產(chǎn)者-消費(fèi)者模式、線程池等。以下是一些使用 AutoResetEvent 的案例:

1. 生產(chǎn)者-消費(fèi)者模式

生產(chǎn)者-消費(fèi)者模式是一種常見的并發(fā)編程模式,其中一個(gè)或多個(gè)生產(chǎn)者線程生成數(shù)據(jù)并將其放入共享緩沖區(qū)(隊(duì)列),而一個(gè)或多個(gè)消費(fèi)者線程從共享緩沖區(qū)中取出數(shù)據(jù)并進(jìn)行處理。AutoResetEvent 可以用于同步生產(chǎn)者和消費(fèi)者線程。

using System;
using System.Threading;

class ProducerConsumer
{
    private static AutoResetEvent _producerReady = new AutoResetEvent(false);
    private static AutoResetEvent _consumerReady = new AutoResetEvent(true);
    private static int[] _buffer = new int[10];
    private static int _producerIndex = 0;
    private static int _consumerIndex = 0;

    static void Main()
    {
        Thread producerThread = new Thread(Producer);
        Thread consumerThread = new Thread(Consumer);

        producerThread.Start();
        consumerThread.Start();

        producerThread.Join();
        consumerThread.Join();
    }

    static void Producer()
    {
        while (true)
        {
            _producerReady.WaitOne(); // 等待消費(fèi)者準(zhǔn)備好

            _buffer[_producerIndex] = GenerateProduct();
            _producerIndex = (_producerIndex + 1) % _buffer.Length;

            Console.WriteLine("Produced: " + _buffer[_producerIndex]);

            _consumerReady.Set(); // 通知消費(fèi)者
        }
    }

    static void Consumer()
    {
        while (true)
        {
            _consumerReady.WaitOne(); // 等待生產(chǎn)者準(zhǔn)備好

            int product = _buffer[_consumerIndex];
            _consumerIndex = (_consumerIndex + 1) % _buffer.Length;

            Console.WriteLine("Consumed: " + product);

            _producerReady.Set(); // 通知生產(chǎn)者
        }
    }

    static int GenerateProduct()
    {
        return new Random().Next();
    }
}

2. 線程池

AutoResetEvent 也可以用于線程池中的任務(wù)調(diào)度。線程池允許你重用已經(jīng)創(chuàng)建的線程,從而減少線程創(chuàng)建和銷毀的開銷。你可以使用 AutoResetEvent 來(lái)同步線程池中的任務(wù),確保它們按照預(yù)期的順序執(zhí)行。

注意:在實(shí)際應(yīng)用中,線程池的使用通常會(huì)更加復(fù)雜,涉及到任務(wù)的排隊(duì)、執(zhí)行、完成等。上面的示例僅用于演示 AutoResetEvent 的基本用法。

3. 同步多個(gè)線程

AutoResetEvent 還可以用于同步多個(gè)線程,確保它們按照預(yù)期的順序執(zhí)行。例如,你可以使用 AutoResetEvent 來(lái)確保主線程在繼續(xù)執(zhí)行之前等待其他線程完成某些操作。

using System;
using System.Threading;

class SynchronizeThreads
{
    private static AutoResetEvent _event = new AutoResetEvent(false);

    static void Main()
    {
        Thread thread1 = new Thread(Thread1);
        Thread thread2 = new Thread(Thread2);

        thread1.Start();
        thread2.Start();

        _event.WaitOne(); // 等待線程1完成
        _event.Set(); // 通知主線程繼續(xù)執(zhí)行

        thread1.Join();
        thread2.Join();
    }

    static void Thread1()
    {
        Console.WriteLine("Thread 1 started.");
        Thread.Sleep(1000); // 模擬耗時(shí)操作
        Console.WriteLine("Thread 1 completed.");

        _event.Set(); // 通知主線程繼續(xù)執(zhí)行
    }

    static void Thread2()
    {
        _event.WaitOne(); // 等待線程1完成
        Console.WriteLine("Thread 2 started.");
        Thread.Sleep(1000); // 模擬耗時(shí)操作
        Console.WriteLine("Thread 2 completed.");
    }
}

這些示例展示了 AutoResetEvent 在不同場(chǎng)景下的基本用法。你可以根據(jù)自己的需求調(diào)整代碼以滿足特定的同步需求。

0