许多等待信号量的线程

时间:2016-10-21 08:48:45

标签: c# multithreading 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();
                }
            }
        }

1 个答案:

答案 0 :(得分:2)

如果你想跳过等待信号量,如果另一个线程持有它,你可以使用WaitAsync(TimeSpan)方法来传递一个时间跨度(假设是十分之一秒)和{{1} } 结果。如果它是await,其他人仍然持有你的资源,你可以对这个事实做出反应(例如跳过你想做的事情)。