2

複数のオブジェクトを管理するDownloadManagerクラスがあります。DownloadItemそれぞれDownloadItemに や のようなイベントがProgressChangedありDownloadCompletedます。通常、すべてのダウンロード アイテムに対して同じイベント ハンドラーを使用する必要があるため、各DownloadItem.

したがって、使用するパターンを決定する必要があります。

  1. 1 つDownloadItemをテンプレートとして使用し、必要に応じて複製します

        var dm = DownloadManager();
        var di = DownloadItem();
        di.ProgressChanged += new DownloadProgressChangedEventHandler(di_ProgressChanged);
        di.DownloadCompleted += new DownloadProgressChangedEventHandler(di_DownloadCompleted);
        DownloadItem newDi;
        newDi = di.Clone();
        newDi.Uri = "http://google.com";
        dm.Enqueue(newDi);
        newDi = di.Clone();
        newDi.Uri = "http://yahoo.com";
        dm.Enqueue(newDi);
    
  2. 代わりにイベント ハンドラを設定し、エンキューDownloadManagerされたそれぞれにイベントをコピーしますDownloadItem

        var dm = DownloadManager();
        dm.ProgressChanged += new DownloadProgressChangedEventHandler(di_ProgressChanged);
        dm.DownloadCompleted += new DownloadProgressChangedEventHandler(di_DownloadCompleted);
        dm.Enqueue(new DownloadItem("http://google.com"));
        dm.Enqueue(new DownloadItem("http://yahoo.com"));
    
  3. または、ある種の工場を使用します

        var dm = DownloadManager();
        var dif = DownloadItemFactory();
        dif.ProgressChanged += new DownloadProgressChangedEventHandler(di_ProgressChanged);
        dif.DownloadCompleted += new DownloadProgressChangedEventHandler(di_DownloadCompleted);
        dm.Enqueue(dif.Create("http://google.com"));
        dm.Enqueue(dif.Create("http://yahoo.com"));
    

あなたは何をお勧めします?

4

2 に答える 2

2

(API 設計の観点から) DownloadItems が進行状況の報告を担当するのはなぜですか?

DownloadManager は DownloadItems のダウンロードを担当しているため、進行状況の報告も担当しています。(もちろん、内部の実装戦略は異なる場合があります。)

私は2番目のオプションを使用します:

var dm = DownloadManager
{
    "http://google.com",
    new DownloadItem("http://yahoo.com") { Retries = 5 }
};

dm.ProgressChanged += (sender, e) =>
    Console.WriteLine("Download {0}: {1:P}", e.Uri, (double)e.Progress / 100.0);

dm.DownloadCompleted += (sender, e) =>
    Console.WriteLine("Download {0}: completed!", e.Uri);

dm.DownloadAllCompleted += (sender, e) =>
    Console.WriteLine("All downloads completed!");

dm.Add("http://stackoverflow.com");
dm.DownloadAllAsync();

フレームワーク デザイン ガイドライン (第 2 版) のコピーを手元に持っている場合は、305 ~ 312 ページ (イベント ベースの非同期パターン) を参照してください。

于 2010-05-01T02:25:14.000 に答える
1

これには、ファクトリを使用したテンプレート メソッド パターンが適切なアプローチであると言えます。

于 2010-05-01T02:15:59.087 に答える