我有三种方法,即方法1,方法2和方法3。
- 方法1是从一个网站下载图片
- 方法2是从第二个站点下载图片
- 方法3是用于比较图像
方法1获取被添加到列表,根据产品的ID逐一即有上再根据每个产品的ID,我感到我添加到列表中的图像集合多个产品ID的集合循环图像的URL列表。
方法1,根据该列表下载图像。
方法2是一样的方法一但下载从第二网站上的图片。
方法3是比较根据这两个网站的每个产品ID下载的图像。
我想要的是方法一下载图像的集合然后运行method2的下载第二个站点的图像,然后方法2运行方法3,其比较的图像。
我使用线程下载和比较这些图像,但因为它同时被下载的图像图像比较图像比较无法比拟的图像。
你可以做的是:
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();
}
这将运行Method1
和Method2
同时放,等待那些之前完成Method3
时开始。
这是一个有点变通,但工程。
我认为,前两种方法可以异步调用,所以你可以写这样的事情:
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;
假设你正在使用.NET 4.5(没有指定在你的标签的版本),可以使用异步和等待。 下面是一个简化的例子:
public async void DownloadImages()
{
// Do something...
await Method1();
await Method2();
await Method3();
// Do something else...
}
听起来像是你有一个多生产者单消费者问题,与下载的任务是生产者和消费者的任务赋予图像进行比较。 没有为并行这里高电位:
Download task 1
\
Compare task
/
Download task 2
你既可以可以并行以及与使用管道模型的比较任务运行前两项任务之间实现并行。
但如何实现这一切? 你可以做的是启动3级平行的任务,每一个上面的。 每两个下载任务将自己阻塞集合( BlockingCollection ),并把图像,因为他们得到下载。 假设相应的图像(具有相同的产品ID)到达顺序,比较任务可以再等上两个集合,并为他们到达对比图像。
为什么不只是运行的方法都在一个线程?
private void Thread_DoStuff(){
Method1();
Method2();
Method3();
}
另外,您也可以使用线程池。 有关线程池的更多信息,可以发现在这里。 。 这可以在线程池通过使用来实现WaitHandle.WaitAll();
然后进行比较两个线程都完成后,
尝试使用任务和ContinueWith方法。 这将创建一个新的线程,并调用每个方法的顺序。
你可以找到关于更详细这篇文章 。