我能找出是否没有线程在等待信号量吗
本文关键字:线程 在等待 信号量 是否 | 更新日期: 2023-09-27 18:25:57
我的应用程序处理许多同时下载。我一次只允许3个下载线程运行,其他下载都在排队等待信号量。
代码:
private static Semaphore semPool = new Semaphore(3, 3);
private static CancellationTokenSource cts = new CancellationTokenSource();
X等待运行的下载次数:
semPool.WaitOne();
DownloadItem d = new DownloadItem(fileInfo, cts.Token, launchAfterDownload);
//wait for download to be complete
semPool.Release()
现在,我想做的是有一个方法来取消所有下载。我通过设置cts来做到这一点。令牌已取消,但我想重置cts。取消所有当前(和等待)下载时使用令牌。
也就是说,我想等到semPool有3个单元。
public static void CancelAllDownloads()
{
cts.Cancel();
//wait until semPool has 3
cts = new CancellationTokenSource();
}
如果我现在调用CancelAllDownloads(),运行的3个下载将被取消,但等待的下载将运行,因为取消令牌已重置。我希望所有等待的令牌也被取消,然后重置取消令牌。
您可以使用SemaphoreSlim类。
这个类具有您所要求的功能,使用它可以取消所有当前下载进程,包括正在运行和等待。然后代码看起来像:
private static SemaphoreSlim semPool = new SemaphoreSlim(3, 3);
semPool.Wait(cts.Token);
public static void CancelAllDownloads()
{
cts.Cancel();
cts = new CancellationTokenSource();
}