我能找出是否没有线程在等待信号量吗



我的应用程序处理许多同时下载。我一次只允许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();
    }

最新更新