2016-10-21 4 views
0

Предположим, что у меня есть метод вызова таймера каждую секунду.Для многих потоков, ожидающих на семафоре

Метод 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(); 
       } 
      } 
     } 
+1

Я не вижу необходимости в том, что вы описали. Это пахнет XY-проблемой. Можете ли вы описать, что вы хотите сделать *? Не кодовое, а то, чего вы хотите достичь? – nvoigt

+0

Я хочу получить отчет каждые несколько секунд в асинхронном методе. Но я хочу быть уверенным, что это не будет проблемой, если методу нужно много времени для завершения. – Raskolnikov

+0

Так что, если это займет слишком много времени? Допустим, что на 1 секунду таймер занимает 2 секунды. Вы хотите спамить новые потоки, пока программа не умрет? И если вы не хотите, чтобы он дождался завершения, то почему ожидания и семафор? – nvoigt

ответ

2

Если вы хотите, чтобы пропустить в ожидании семафора, если другой поток имеет держание на него, вы можете использовать метод WaitAsync(TimeSpan), чтобы пройти отрезок времени (давайте скажем, десятую часть секунды) и результат await. Если это false, кто-то еще держит ваш ресурс, и вы можете реагировать на этот факт (например, пропуская все, что вы хотели сделать).

+0

См. Редактировать 2 в моем вопросе. Это то, что ты думал? – Raskolnikov

+0

@ Раскольников Ах, да. – nvoigt

+0

Благодарим за помощь. – Raskolnikov