1

ローカルに保存する必要があるファイルを読み取ることができる必要があり、ファイルがまだ存在しない場合はダウンロードする必要があります。これが私が達成しようとしていることの単純化されたバージョンです:

// See if the file exists locally
if (!File.Exists(physicalPath))
{
    // file doesn't exist, download it
    using (WebClient client = new WebClient())
    {
        client.DownloadFile(url, physicalPath);
    }
}

// open up the file and do stuff ..

後で起こることのために、ストリームを使用できませんが、最初にファイルをディスクに保存する必要があります。

1 回の呼び出しですべてがうまく機能しますが、ご想像のとおり、この関数を同時に 1,000 プロセスが実行すると問題が発生します。2 つのプロセスが同時に開始されると、次のようになると思います。

プロセス 1:

  1. ファイルはローカルに存在しますか? いいえ
  2. ファイルのダウンロードを開始します
  3. ファイルのダウンロードが完了しました
  4. ファイルを読む

プロセス 2:

  1. ファイルはローカルに存在しますか? はい
  2. ファイルを読む
  3. 例外!!!別のプロセスによって使用されているファイル

そのため、プロセス 2 はファイルが存在することを認識しますが、これはプロセス 1 が既にファイルをアクティブにダウンロードしているが、プロセス 1 がまだファイルのダウンロードを完了していないためです。プロセス 2 (および進行中の他のすべてのプロセス) に望むことは、プロセス 1 がファイルのダウンロードを完了するのを待つことです。

ここで役立つのは、プロセス 1 のダウンロードがプロセス 2 で機能することです。つまり、プロセス 2 には異なるデータがなく、ファイルへの書き込みも必要ありません。プロセス 1 がファイルをダウンロードしている場合、プロセス 2 はファイルをダウンロードする必要がなく、プロセス 1 が完了するのを待つことができます。

要約すると、プロセス 1 が他のプロセスで必要なファイルを既にダウンロードしている場合、プロセス 1 が終了するのを待つために他のプロセスを続行できないようにするにはどうすればよいでしょうか? ファイルの準備ができたら、プロセス 2 を続行するにはどうすればよいですか? (C# 4.0 を使用)

また、明確にする必要がありますが、この操作の速度は優先度 1 です。

4

2 に答える 2

2

セットアップ全体は、調整が難しい競合状態になりやすいように思えます。

リクエストをキューに入れ、他のプロセスのためにそれらをダウンロードする責任がある別の(シングルトン)プロセスを作成します。ある種の IPC (WCF など) を介して対話することができます。

于 2013-04-26T14:48:34.657 に答える