【问题标题】:Use ThreadPool in C# within a loop and wait for all threads to finish在循环中使用 C# 中的 ThreadPool 并等待所有线程完成
【发布时间】:2020-04-14 06:14:42
【问题描述】:

我有一个简单的 C# 代码,如下所示:

using System;
using System.Threading;
using System.Diagnostics;


namespace ThreadPooling
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Enter the number of calculations to be made:");
            int calculations= Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("Thread Pool Execution");

            for (int i = 1; i <= calculations; i++)
            {
                Console.WriteLine("Staring process " + i + "...");
                ThreadPool.QueueUserWorkItem(new WaitCallback(Process(i)));
            }

            Console.WriteLine("All calculations done.");
            Console.WriteLine("\nPress any key to exit the program...");
            Console.ReadKey();

        }

        static void Process(object callback, int name)
        {
            for (int i = 0; i <= 10; i++)
            {
                Console.WriteLine(i + " is the current number in " +  name);
            }
        }


    }
}

我希望main 能够使用线程池和参数调用Process。然后我希望程序在告诉用户它完成之前等待所有线程完成。我该怎么做?看来我不能在 Process 中添加参数,我得到:Error CS7036 There is no argument given that corresponds to the required formal parameter 'name' of 'Program.Process(object, int)'

我不清楚如何告诉 C# 在告诉用户它完成之前等待循环中的所有进程完成。

【问题讨论】:

  • 你的方法Process 有两个参数,objectint,但是当你调用它时你只传入一个参数。试试ThreadPool.QueueUserWorkItem(_ =&gt; Process(i, i));

标签: c# threadpool


【解决方案1】:

.NET 已有近 20 年的历史,其中包含几代改进的 API。

这对于较新的 Task Parallel Library 方法来说是微不足道的。 EG

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace ThreadPooling
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Enter the number of calculations to be made:");
            int calculations = Convert.ToInt32(Console.ReadLine());

            var tasks = new List<Task>();
            for (int i = 1; i <= calculations; i++)
            {
                int processNum = i;
                Console.WriteLine("Staring process " + processNum + "...");
                var task = Task.Run(() => Process(processNum));
                tasks.Add(task);
            }

            Task.WaitAll(tasks.ToArray());
            Console.WriteLine("All calculations done.");
            Console.WriteLine("\nPress any key to exit the program...");
            Console.ReadKey();

        }

        static void Process(int name)
        {
            for (int i = 0; i <= 10; i++)
            {
                Console.WriteLine(i + " is the current number in " + name);
            }
        }


    }
}

【讨论】:

猜你喜欢
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多