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