2

我有三种方法,即 Method1、Method2 和 Method3。

  • Method1 用于从一个站点下载图像
  • Method2 用于从第二个站点下载图像
  • Method3 用于比较图像

方法 1 根据产品 ID 逐一获取要添加到列表的图像 url 列表,即多个产品 ID 的集合上有一个循环,然后根据每个产品 ID,我得到一个添加到列表中的图像集合。
Method1 根据该列表下载图像。

Method2 与 Method1 相同,但从第二个站点下载图像。

Method3根据两个站点的每个产品id比较下载的图像。

我想要的是 Method1 下载图像集合然后运行 ​​Method2 下载第二个站点的图像,然后 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

我认为前两个方法可以异步调用,所以你可以这样写:

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   

您可以在可以并行运行的前两个任务之间以及使用管道模型的比较任务之间实现并行性。

但是如何实现这一切呢?你可以做的是启动 3 个并行任务,每个任务一个。这两个下载任务中的每一个都将拥有一个阻塞集合(BlockingCollection)并在下载图像时放置它们。假设相应的图像(具有相同的产品 ID)按顺序到达,则比较任务可以等待两个集合并在图像到达时进行比较。

于 2012-11-22T08:13:17.137 回答
0

为什么不在一个线程中运行所有方法?

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

或者,您可以使用线程池。关于线程池的更多信息可以在这里找到。. 这可以在 ThreadPool 中通过使用WaitHandle.WaitAll();then 在两个线程完成后进行比较来实现

于 2012-11-22T08:13:50.883 回答