Пусть поток ждет n чисел импульсов
Как я могу ждать n числа импульсов?
… // do something
waiter.WaitForNotifications();
Я хочу, чтобы вышеупомянутый поток дождался уведомления n раз (через n разных потоков или n раз одним и тем же потоком).
Я считаю, что есть счетчик, но я не могу его найти.
Ответы
Ответ 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)