对于等待信号量的许多线程

To many threads waiting on semaphore

假设我每秒都有定时器调用方法。

方法是异步的(必须是异步的),我使用 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();
        }
    }

编辑:

我想在异步方法中每隔几秒获取一次报告。但我想确保如果方法需要很长时间才能完成,这不会成为问题。


编辑 2 - 解决方案:

       private async void ReportTimerCallback(object state)
        {
            if (await semaphoreSlimValue.WaitAsync(10))
            {
                try
                {
                    await Task.FromResult(0);
                    Thread.Sleep(5000);
                }
                finally
                {
                    semaphoreSlim.Release();
                }
            }
        }

如果你想在另一个线程持有信号量时跳过等待信号量,你可以使用 WaitAsync(TimeSpan) 方法,传递一个时间跨度(比如十分之一秒)和 await 结果。如果是 false,其他人仍在持有您的资源,您可以对此做出反应(例如,跳过您想做的任何事情)。