我能否知道没有线程在等待信号量?

时间:2013-08-01 08:44:51

标签: c# .net

我的应用程序处理许多同步下载。我当时只允许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.Token设置为已取消来执行此操作,但我想在取消所有当前(和等待)下载时重置cts.Token。

也就是说,我想等到semPool有3个单位。

public static void CancelAllDownloads()
{
    cts.Cancel();
    //wait until semPool has 3
    cts = new CancellationTokenSource();
}

如果我现在调用CancelAllDownloads(),则会取消正在运行的3次下载,但是等待的那些将在重置取消令牌后运行。我希望所有等待的人也被取消,然后重置取消令牌。

1 个答案:

答案 0 :(得分:2)

您可以做的是改为使用SemaphoreSlim类。

此类具有您要求的功能,使用它可以取消所有当前下载过程,包括运行和等待。然后代码看起来像:

private static SemaphoreSlim semPool = new SemaphoreSlim(3, 3);

semPool.Wait(cts.Token);

public static void CancelAllDownloads()
    {
        cts.Cancel();
        cts = new CancellationTokenSource();
    }