使用多线程和 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);
    }
}

请问有什么想法吗?

谢谢

使用多线程和 C# 运行一个接一个的进程

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 队列中。