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