2013-08-01 56 views
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個下載運行將被取消,但那些等待運行,因爲取消標記復位。我希望所有等待的人也被取消,然後重置取消令牌。

+1

您便無法使用IsCanceled成員或靜態的,它被設置爲true,如果被稱爲CancelAllDownloads和semPool.WaitOne之後被選中()被調用。您可以通過使用鎖定對象來確保安全。如果它已設置,則只需從您的線程返回,因爲此時尚未開始下載任何內容。 – dixus

回答

2

你可以做的是使用SemaphoreSlim類代替。

這個類有你所要求的,使用它你可以取消所有當前下載過程中,無論是捉迷藏和等待的功能。然後,該代碼看起來是這樣的:

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

semPool.Wait(cts.Token); 

public static void CancelAllDownloads() 
    { 
     cts.Cancel(); 
     cts = new CancellationTokenSource(); 
    }