对于等待信号量的许多线程
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
,其他人仍在持有您的资源,您可以对此做出反应(例如,跳过您想做的任何事情)。
假设我每秒都有定时器调用方法。
方法是异步的(必须是异步的),我使用 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
,其他人仍在持有您的资源,您可以对此做出反应(例如,跳过您想做的任何事情)。