2013-08-01 57 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(); 
    }