如何在c#中使用线程一个接一个地运行3个方法?

时间:2012-11-22 08:00:02

标签: multithreading c#-4.0 methods webclient downloading

我有三种方法,即Method1,Method2&方法3。

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

Method1获取根据产品ID逐个添加到列表中的图像URL列表,即在多个产品ID的集合上有一个循环,然后根据每个产品ID我得到一组我添加到的图像清单。
Method1根据该列表下载图像。

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

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

我想要的是Method1下载图像集合然后运行Method2,下载第二个站点的图像,然后Method2运行Method3,比较图像。
我正在使用线程来下载和比较这些图像,但图像比较无法比较图像,因为它会在下载图像时比较图像。

6 个答案:

答案 0 :(得分: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开始前完成的内容。
这是一个小小的工作,但有效。

答案 1 :(得分: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;

答案 2 :(得分:2)

假设您使用的是.NET 4.5(您没有在标记中指定版本),可以使用async和await。这是一个简化的例子:

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

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

    // Do something else...
}

答案 3 :(得分:0)

尝试使用Task和ContinueWith方法。它将创建一个新线程并按顺序调用每个方法。

您可以在this article中找到有关该内容的更多详细信息。

答案 4 :(得分:0)

听起来你有一个多生产者 - 单一消费者问题,下载任务是生产者,并将图像提供给要比较的消费者任务。这里存在很大的并行潜力:

Download task 1
                 \
                    Compare task
                 /
Download task 2   

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

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

答案 5 :(得分:0)

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

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

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