Подтвердить что ты не робот

Пусть поток ждет n чисел импульсов

Как я могу ждать n числа импульсов?

… // do something
waiter.WaitForNotifications();

Я хочу, чтобы вышеупомянутый поток дождался уведомления n раз (через n разных потоков или n раз одним и тем же потоком).

Я считаю, что есть счетчик, но я не могу его найти.

4b9b3361

Ответ 1

Посмотрите CountdownEvent Class:

CountdownEvent Class

Представляет примитив синхронизации, который сигнализируется, когда его счетчик достигает нуля.

Пример:

CountdownEvent waiter = new CountdownEvent(n);

// notifying thread
waiter.Signal();

// waiting thread
waiter.Wait();

Ответ 2

Используя простые ManualResetEvent и Interlocked.Decrement

class SimpleCountdown
{
    private readonly ManualResetEvent mre = new ManualResetEvent(false);

    private int remainingPulses;

    public int RemainingPulses
    {
        get
        {
            // Note that this value could be not "correct"
            // You would need to do a 
            // Thread.VolatileRead(ref this.remainingPulses);
            return this.remainingPulses;
        }
    }

    public SimpleCountdown(int pulses)
    {
        this.remainingPulses = pulses;
    }

    public void Wait()
    {
        this.mre.WaitOne();
    }

    public bool Pulse()
    {
        if (Interlocked.Decrement(ref this.remainingPulses) == 0)
        {
            mre.Set();
            return true;
        }

        return false;
    }
}

public static SimpleCountdown sc = new SimpleCountdown(10);

public static void Waiter()
{
    sc.Wait();
    Console.WriteLine("Finished waiting");
}

public static void Main()
{
    new Thread(Waiter).Start();

    while (true)
    {
        // Press 10 keys
        Console.ReadKey();

        sc.Pulse();
    }
}

Обратите внимание, что в конце концов, эта проблема часто связана с этой другой проблемой: Обходной путь для ограничения дескриптора WaitHandle.WaitAll 64?

Мое решение хорошо, если у вас нет .NET >= 4 (потому что другое решение, CountdownEvent, было введено в .NET 4)