使用多线程和 C# 运行一个接一个的进程
本文关键字:一个 进程 多线程 运行 | 更新日期: 2023-09-27 18:32:29
我使用多线程来处理数据列表。在下面的示例中,对于每个元素,如何确保"SecondProcess"始终在"FirstProcess"完成后运行?队列中正在处理的元素的顺序并不重要。
public class Processor
{
public void Process()
{
IList<int> queue = QueueGenerator.GetRandomInt(50); //gets a list of 50 unique random integer
foreach (int eachElement in queue)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(FirstProcess), eachElement);
}
Console.ReadLine();
}
private void FirstProcess(object toProcess)
{
int i = 0;
int.TryParse(toProcess.ToString(), out i);
string odd = "odd";
string even = "even";
string toDisplay = (i%2 == 0)
? string.Format("First step: Processing {0} ({1} number)", i, even)
: string.Format("First step: Processing {0} ({1} number)", i, odd);
Console.WriteLine(toDisplay);
}
private void SecondProcess(object toProcess)
{
int i = 0;
int.TryParse(toProcess.ToString(), out i);
Console.WriteLine("Second step: Processing -> {0}", i);
}
}
请问有什么想法吗?
谢谢
If,而不是
foreach (int eachElement in queue)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(FirstProcess), eachElement);
}
你做到了
Parallel.ForEach(queue, eachElement => FirstProcess(eachElement));
这将在ThreadPool
中并行调用每个项目的委托,queue
,但在处理完所有元素之前阻止。
这意味着当下一行代码在此调用线程上执行时,所有工作都将完成。
现在,您只需再做一次:
Parallel.ForEach(queue, eachElement => SecondProcess(eachElement));
使用 Parallel
类将具有优势,因为它可以使用分区程序,因此可以有效地将批处理操作排队到 ThreadPool 中,而不是将单个项目排队到 ThreadPool 队列中。