假设我每秒钟都有计时器调用方法。
方法是异步(必须是异步的),而我通过使用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();
}
}
}发布于 2016-10-21 09:08:32
如果您想跳过等待信号量(如果另一个线程对它有控制),您可以使用WaitAsync(TimeSpan)方法传递一个timespan (假设是十分之一秒)并await结果。如果是false,其他人仍然持有您的资源,您可以对此做出反应(例如,跳过您想要做的任何事情)。
https://stackoverflow.com/questions/40172195
复制相似问题