C# 到许多等待信号量的线程
假设我每秒都有一个计时器调用方法 方法是异步的(必须是异步的),我使用信号量lim同步方法。 方法需要5秒才能完成 我将有许多线程等待信号量。这是真的吗?这是个问题吗? 由于这是计时器,我将有越来越多的线程等待信号量 我如何解决这个问题? 如果信号量没有释放(只是跳过代码),是否可以不等待 计时器:C# 到许多等待信号量的线程,c#,multithreading,semaphore,C#,Multithreading,Semaphore,假设我每秒都有一个计时器调用方法 方法是异步的(必须是异步的),我使用信号量lim同步方法。 方法需要5秒才能完成 我将有许多线程等待信号量。这是真的吗?这是个问题吗? 由于这是计时器,我将有越来越多的线程等待信号量 我如何解决这个问题? 如果信号量没有释放(只是跳过代码),是否可以不等待 计时器: PoolReportTimer = new Timer(ReportTimerCallback, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
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();
}
}
}
如果希望在另一个线程挂起信号量时跳过等待,可以使用该方法传递时间跨度(比如说十分之一秒)并等待结果。如果它是
false
,其他人仍在占用您的资源,您可以对此做出反应(例如,跳过您想做的任何事情)。如果您想跳过等待信号量的过程(如果另一个线程占用了该信号量),您可以使用该方法来传递时间跨度(比方说十分之一秒)然后等待结果。如果为false
,则其他人仍持有您的资源,您可以对该事实作出反应(例如,跳过您想做的任何事情)。我认为不需要您描述的内容。这闻起来像个XY问题。你能描述一下你想做什么吗?不是代码方面的问题,但您希望实现什么?我希望在异步方法中每隔几秒钟获取一次报告。但我想确定的是,若这个方法需要很多时间来完成,那个么这将不会是一个问题。那个么,若它确实需要太长的时间呢?假设一个1秒计时器需要2秒。是否要在程序停止之前发送新线程的垃圾邮件?如果你不想等待一个完成,为什么要等待和信号量?我需要信号量,因为我不知道如何在没有信号量的异步方法中同步。锁不能在异步方法中使用。您可以从代码中后退一步吗。你能解释一下你想发生什么吗?所以每一秒你都会制作一份报告。当生成报告需要2秒钟时会发生什么?我不认为有必要使用您描述的内容。这闻起来像个XY问题。你能描述一下你想做什么吗?不是代码方面的问题,但您希望实现什么?我希望在异步方法中每隔几秒钟获取一次报告。但我想确定的是,若这个方法需要很多时间来完成,那个么这将不会是一个问题。那个么,若它确实需要太长的时间呢?假设一个1秒计时器需要2秒。是否要在程序停止之前发送新线程的垃圾邮件?如果你不想等待一个完成,为什么要等待和信号量?我需要信号量,因为我不知道如何在没有信号量的异步方法中同步。锁不能在异步方法中使用。您可以从代码中后退一步吗。你能解释一下你想发生什么吗?所以每一秒你都会制作一份报告。生成报告需要2秒钟时会发生什么?请参阅我问题中的编辑2。你是这么想的吗?@Raskolnikov啊,是的。谢谢你的帮助。见我问题中的编辑2。你是这么想的吗?@Raskolnikov啊,是的。谢谢你的帮助。