私のアプリケーションは、多数の同時ダウンロードを処理します。一度に実行できるダウンロード スレッドは 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 つのダウンロードはキャンセルされますが、キャンセル トークンがリセットされるため、待機中のダウンロードは実行されます。待機中のものもすべてキャンセルしてから、キャンセルトークンをリセットします。