2

Method1、Method2、Method3 の 3 つのメソッドがあります。

  • Method1は、1つのサイトから画像をダウンロードするためのものです
  • Method2 は、2 番目のサイトから画像をダウンロードするためのものです。
  • Method3 は画像を比較するためのものです

Method1 は、製品 ID に従ってリストに追加される画像 URL のリストを 1 つずつ取得します。つまり、複数の製品 ID のコレクションにループがあり、各製品 ID に従って、リストに追加する画像のコレクションを取得します。
Method1 は、そのリストに従ってイメージをダウンロードします。

Method2 は Method1 と同じですが、2 番目のサイトから画像をダウンロードします。

Method3 は、両サイトの各製品 ID に従ってダウンロードされた画像を比較します。

私が望むのは、Method1 が画像のコレクションをダウンロードし、次に Method2 を実行して 2 番目のサイトの画像をダウンロードし、次に Method2 が Method3 を実行して画像を比較することです。
これらの画像をダウンロードして比較するためにスレッドを使用していますが、画像のダウンロード中に画像を比較するため、画像比較では画像を比較できませんでした。

4

6 に答える 6

4

あなたができることは次のとおりです。

private Thread tMethod1 = new Thread(runMethod1);
private Thread tMethod2 = new Thread(runMethod2);
private Thread tMethod3 = new Thread(runMethod3);


private void runThreads();
{
    tMethod1.Start(); //starts method 1
    tMethod2.Start(); //starts method 2
    tMethod1.Join();  //waits for method 1 to finish
    tMethod2.Join();  //waits for method 2 to finish
    tMethod3.Start(); //starts method 3
    tMethod3.Join();  //waits for method 3 to finish
}

private void runMethod1()
{
    Method1();
}
private void runMethod2()
{
    Method2();
}
private void runMethod3()
{
    Method3();
}

これは同時に実行Method1Method2れ、それらが終了するのを待ってからMethod3開始されます。
ちょっとした回避策ですが、機能します。

于 2012-11-22T08:17:34.817 に答える
3

最初の 2 つのメソッドは非同期で呼び出すことができると思うので、次のように記述できます。

Task<List<Image>>[] tasks = new Task<int>[2];
tasks[0] = new Task<List<Image>>(() => Method1());
tasks[1] = new Task<List<Image>>(() => Method2());

var continuation = Task.Factory.ContinueWhenAll(
                   tasks,
                   (antecedents) =>
                   {
                        Method3(tasks[0].Result,tasks[1].Result);
                   });
tasks[0].Start();
tasks[1].Start();
var comparisonResult = continuation.Result;
于 2012-11-22T08:14:37.940 に答える
2

.NET 4.5 を使用していると仮定すると (タグでバージョンを指定していません)、async と await を使用できます。簡単な例を次に示します。

public async void DownloadImages()
{
    // Do something...

    await Method1();
    await Method2();
    await Method3();

    // Do something else...
}
于 2012-11-22T08:04:00.613 に答える
0

Task と ContinueWith メソッドで試してください。新しいスレッドを作成し、各メソッドを順次呼び出します。

詳細については、この記事を参照してください。

于 2012-11-22T08:12:40.723 に答える
0

複数のプロデューサーと単一の消費者の問題があり、ダウンロード タスクがプロデューサーであり、比較対象のコンシューマー タスクに画像を提供しているようです。ここでは、並列処理の可能性が高くなります。

Download task 1
                 \
                    Compare task
                 /
Download task 2   

並列に実行できる最初の 2 つのタスク間と、パイプライン モデルを使用した比較タスクの両方で並列処理を実現できます。

しかし、これをすべて実装する方法は? できることは、上記のそれぞれに 1 つずつ、3 つの並列タスクを開始することです。2 つのダウンロード タスクはそれぞれ、ブロッキング コレクション ( BlockingCollection ) を所有し、ダウンロードされたときに画像を配置します。対応するイメージ (同じ製品 ID を持つ) が順番に到着すると仮定すると、比較タスクは両方のコレクションを待機し、到着したイメージを比較できます。

于 2012-11-22T08:13:17.137 に答える
0

すべてのメソッドを 1 つのスレッドで実行しないのはなぜですか?

private void Thread_DoStuff(){
Method1();
Method2();
Method3();
}

または、スレッドプールを使用できます。スレッドプールの詳細については、こちらを参照してください。. これは、ThreadPool で実現できます。WaitHandle.WaitAll();次に、2 つのスレッドが終了した後に比較を続行します。

于 2012-11-22T08:13:50.883 に答える