0

小さなファイルダウンローダーを開発しています。ファイルをセグメント化してダウンロードし、各セグメントを並行してダウンロードします。私は自分のアプリケーションがイベント システムをサポートすることを望みました。これは、理想的には、既に行われた全体の進行状況を表示するものです。

私の現在の素朴なアプローチは、各スレッドが 10k をダウンロードするたびに、すべてのスレッドが現在の進行状況に関する情報を格納しているデータ構造を単純にロックすることです。次に、計算を行い、イベントを発生させます。これには、通常、スレッドがすべて同時にイベントを発生させるという問題があり、イベントを発生させるたびに構造全体をロックしているという問題があります。一方、接続が遅くなると、イベントが発生するまでに時間がかかることがあります。100ミリ秒ごとにイベントを発生させるシステムが欲しいです。

ソリューションは機能しますが、私はあまり満足していません。説明されている状況への正しいアプローチは何でしょうか?

4

1 に答える 1

3

すべてのスレッドが進捗情報を書き込むキューとしてBlockingCollectionを使用できます。次に、BlockingCollection から項目をデキューするためだけに存在する別のスレッドを用意します。

デキュースレッドは次のようになります

foreach (var progressMessage in progressMessageQueue.GetConsumingEnumerable())
{
    // Handle progressMessage by raising an event.
}

進行状況情報をカプセル化するクラスが呼び出されると仮定するとProgressMessage、次のようにキューを宣言します。

BlockingCollection<ProgressMessage> progressMessageQueue = new BlockingCollection<ProgressMessage>();

アイテムをキューに追加すると、次のようになります。

progressMessageQueue.Add(progressMessage);

そして、すべてのスレッドが作業を終了したことがわかったら、次のように呼び出します。

progressMessageQueue.CompleteAdding();

数ミリ秒ごとに進行状況メッセージをキューに入れる限り。それはずっと難しいです。ファイルのチャンクが十分に速くダウンロードされなかった場合は、何らかのタイムアウト処理が必要になります。ファイルをダウンロードする方法がわからないので、どうやってそれを行うのかわかりません。

于 2013-03-29T08:46:00.940 に答える