Multithreading 如何在c#中使用线程逐个运行3个方法?

Multithreading 如何在c#中使用线程逐个运行3个方法?,multithreading,c#-4.0,methods,webclient,download,Multithreading,C# 4.0,Methods,Webclient,Download,我有三种方法,即方法1、方法2和方法3 方法1用于从一个站点下载图像 方法2用于从第二个站点下载图像 方法3用于比较图像 Method1根据产品id逐个获取要添加到列表中的图像URL列表,即在多个产品id的集合上有一个循环,然后根据每个产品id获取添加到列表中的图像集合。 方法1根据该列表下载图像 方法2与方法1相同,但从第二个站点下载图像 方法3比较根据两个站点的每个产品id下载的图像 我想要的是Method1下载图像集合,然后运行Method2下载第二个站点的图像,然后Method2运行

我有三种方法,即方法1、方法2和方法3

  • 方法1用于从一个站点下载图像
  • 方法2用于从第二个站点下载图像
  • 方法3用于比较图像
Method1根据产品id逐个获取要添加到列表中的图像URL列表,即在多个产品id的集合上有一个循环,然后根据每个产品id获取添加到列表中的图像集合。
方法1根据该列表下载图像

方法2与方法1相同,但从第二个站点下载图像

方法3比较根据两个站点的每个产品id下载的图像

我想要的是Method1下载图像集合,然后运行Method2下载第二个站点的图像,然后Method2运行Method3比较图像。

我正在使用线程来下载和比较这些图像,但图像比较无法比较图像,因为它在下载图像时比较图像。

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

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

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

    // Do something else...
}

尝试任务并继续使用方法。它将创建一个新线程并按顺序调用每个方法


你可以在中找到更多的细节

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

Download task 1
                 \
                    Compare task
                 /
Download task 2   
您可以在前两个可以并行运行的任务之间以及使用管道模型与比较任务之间实现并行


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

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

private void Thread_DoStuff(){
Method1();
Method2();
Method3();
}
或者,您可以使用线程池。可以找到有关线程池的更多信息。
这可以通过使用
WaitHandle.WaitAll()在线程池中实现然后在两个线程完成后继续比较

我认为前两个方法可以异步调用,因此您可以编写如下代码:

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;
Task[]tasks=新任务[2];
任务[0]=新任务(()=>Method1());
任务[1]=新任务(()=>Method2());
var continuation=Task.Factory.continuatewhell(
任务,
(先行项)=>
{
方法3(任务[0]。结果,任务[1]。结果);
});
任务[0]。开始();
任务[1]。开始();
var comparisonResult=continuation.Result;
您可以做的是:

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
之前等待它们完成。

这是一个很小的解决方法,但是很有效。

如果你想按顺序执行,就按顺序执行。为什么你要在三个线程中运行这三个方法,而不是在一个线程中简单地调用它们?听起来方法1和方法2可以并行运行。即使是相应图像的比较也可以与其他工作并行进行。为什么要按顺序运行?@Tudor我不反对并行运行method1和method2。我会试试的。好的,请考虑更新你的标签。(我不能,因为还有另一个更新挂起)。如果您安装了
Microsoft.Bcl.Async
,您可以在.NET 4.0上使用
Async
。实际上,在这种情况下,线程1和2可以并行运行。所以最好是两个都开始,然后两个都加入。啊,是的,这是真的。我仔细考虑过这个事实。将相应地调整我的代码。@FlorisPrijt谢谢。我试试看。