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个下载运行将被取消,但那些等待运行,因为取消标记复位。我希望所有等待的人也被取消,然后重置取消令牌。
您便无法使用IsCanceled成员或静态的,它被设置为true,如果被称为CancelAllDownloads和semPool.WaitOne之后被选中()被调用。您可以通过使用锁定对象来确保安全。如果它已设置,则只需从您的线程返回,因为此时尚未开始下载任何内容。 – dixus