Предположим, что у меня есть метод вызова таймера каждую секунду.Для многих потоков, ожидающих на семафоре
Метод isync (должен быть асинхронным) и метод синхронизации с помощью SemaphoreSlim. Для завершения процедуры требуется 5 секунд.
У меня будет много потоков, ожидающих на семафоре. Это правда? Это проблема ? Поскольку это таймер, у меня будет больше и больше потоков, ожидающих семафора.
Как решить эту проблему? Можно ли не дождаться, если семафор не будет выпущен (просто пропустите код)?
Таймер:
PoolReportTimer = new Timer(ReportTimerCallback, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
Метод:
private static SemaphoreSlim semaphoreSlimValue = new SemaphoreSlim(1, 1);
private async void ReportTimerCallback(object state)
{
try
{
await semaphoreSlimValue.WaitAsync();
await Task.FromResult(0);
Thread.Sleep(5000);
}
finally
{
semaphoreSlim.Release();
}
}
EDIT:
Я хочу, чтобы сообщить каждые несколько второй в методе асинхронным. Но я хочу быть уверенным, что это не будет проблемой, если методу нужно много времени для завершения.
EDIT 2 - Решение:
private async void ReportTimerCallback(object state)
{
if (await semaphoreSlimValue.WaitAsync(10))
{
try
{
await Task.FromResult(0);
Thread.Sleep(5000);
}
finally
{
semaphoreSlim.Release();
}
}
}
Я не вижу необходимости в том, что вы описали. Это пахнет XY-проблемой. Можете ли вы описать, что вы хотите сделать *? Не кодовое, а то, чего вы хотите достичь? – nvoigt
Я хочу получить отчет каждые несколько секунд в асинхронном методе. Но я хочу быть уверенным, что это не будет проблемой, если методу нужно много времени для завершения. – Raskolnikov
Так что, если это займет слишком много времени? Допустим, что на 1 секунду таймер занимает 2 секунды. Вы хотите спамить новые потоки, пока программа не умрет? И если вы не хотите, чтобы он дождался завершения, то почему ожидания и семафор? – nvoigt