假设我每秒都有计时器调用方法。
方法是异步(必须是异步),我使用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();
}
}
}
答案 0 :(得分:2)
如果你想跳过等待信号量,如果另一个线程持有它,你可以使用WaitAsync(TimeSpan)方法来传递一个时间跨度(假设是十分之一秒)和{{1} } 结果。如果它是await
,其他人仍然持有你的资源,你可以对这个事实做出反应(例如跳过你想做的事情)。