3

我的应用程序处理许多同时下载。我当时只允许 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 个下载将被取消,但由于取消令牌被重置,等待的下载将运行。我也希望取消所有等待的,然后重置取消令牌。

4

1 回答 1

2

您可以做的是改用SemaphoreSlim类。

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

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

semPool.Wait(cts.Token);

public static void CancelAllDownloads()
    {
        cts.Cancel();
        cts = new CancellationTokenSource();
    }
于 2013-08-01T09:16:33.437 回答