首页 文章

带有C#输入列表的多线程[关闭]

提问于
浏览
-2

我对多线程完全不熟悉 . 我试着进行一个简单的测试,我有一个从1到100的数字列表 . 我想多线程的函数只是一个函数,将数字乘以5然后console.writeline结果

class Program {public static List data = new List(); public static void Main(string [] args){new Program() . run(); foreach(数据中的int d){Console.WriteLine(d); }

}
    int multiply (int a){
        return 5 * a;
    }
    void run()
    {
        int threadCount = 5;
        Task[] workers = new Task[threadCount];

        Task.Factory.StartNew(consumer);

        for (int i = 0; i < threadCount; ++i)
        {
            int workerId = i;
            Task task = new Task(() => worker(workerId));
            workers[i] = task;
            task.Start();
        }

        for (int i = 0; i < 100; ++i)
        {
            Console.WriteLine("Queueing work item {0}", i);
            inputQueue.Add(i);
            Thread.Sleep(50);
        }

        Console.WriteLine("Stopping adding.");
        inputQueue.CompleteAdding();
        Task.WaitAll(workers);
        outputQueue.CompleteAdding();
        Console.WriteLine("Done.");

        Console.ReadLine();
    }

    void worker(int workerId)
    {
        Console.WriteLine("Worker {0} is starting.", workerId);

        foreach (int workItem in inputQueue)
        {
            int b= multiply(workItem);
            data.Add(b);
            Console.WriteLine("Worker {0} is processing item {1}." ,workerId,b);
            Thread.Sleep(100);          // Simulate work.
            outputQueue.Add(workItem);  // Output completed item.
        }

        Console.WriteLine("Worker {0} is stopping.", workerId);
    }

    void consumer()
    {
        Console.WriteLine("Consumer is starting.");

        foreach (var workItem in outputQueue.GetConsumingEnumerable())
        {
            Console.WriteLine("Consumer is using item {0}", workItem);
            Thread.Sleep(25);
        }

        Console.WriteLine("Consumer is finished.");
    }

    BlockingCollection<int> inputQueue = new BlockingCollection<int>();
    BlockingCollection<int> outputQueue = new BlockingCollection<int>();
}

1 回答

  • 1

    这是你要问的吗?

    using System;
    using System.Collections.Generic;
    using System.Threading;
    
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>();
    
            for (int i = 0; i <= 100; i++) { list.Add(i); }
    
            foreach (int value in list)
            {
                Thread thread = new Thread(() => PrintNumberTimesFive(value));
                thread.Start();
            }
    
            Console.ReadLine();
        }
    
        static void PrintNumberTimesFive(int number)
        {
            Console.WriteLine(number * 5);
        }
    }
    

相关问题