我的应用程序处理许多同步下载。我当时只允许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次下载,但是等待的那些将在重置取消令牌后运行。我希望所有等待的人也被取消,然后重置取消令牌。
答案 0 :(得分:2)
您可以做的是改为使用SemaphoreSlim类。
此类具有您要求的功能,使用它可以取消所有当前下载过程,包括运行和等待。然后代码看起来像:
private static SemaphoreSlim semPool = new SemaphoreSlim(3, 3);
semPool.Wait(cts.Token);
public static void CancelAllDownloads()
{
cts.Cancel();
cts = new CancellationTokenSource();
}