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 つのダウンロードはキャンセルされますが、キャンセル トークンがリセットされるため、待機中のダウンロードは実行されます。待機中のものもすべてキャンセルしてから、キャンセルトークンをリセットします。

4

1 に答える 1

2

できることは、代わりにSemaphoreSlimクラスを使用することです。

このクラスには、あなたが求めている機能があります。これを使用すると、実行中と待機中の両方の現在のダウンロード プロセスをすべてキャンセルできます。コードは次のようになります。

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

semPool.Wait(cts.Token);

public static void CancelAllDownloads()
    {
        cts.Cancel();
        cts = new CancellationTokenSource();
    }
于 2013-08-01T09:16:33.437 に答える