c# - 如何在不使用 threadPool 和使用 EventWaitHandler 进行处理的情况下运行线程束中的进程数

标签 c# multithreading event-wait-handle

  class Process
{
    static void Main(string[] args)
    {
        int threads = 0;
        int processes = 0;
        Console.WriteLine("Total number of processes:");
        processes = Convert.ToInt32(Console.ReadLine());
        Console.WriteLine("Enter number of parallel threads:");
        threads = Convert.ToInt32(Console.ReadLine());

        ManualResetEvent[] events = new ManualResetEvent[threads];

        int k = 0, innercount = 0;           
        //----running in bunches
        do
        {
            for (int l = 0; l < threads; l++)
            {
                if (k < threads)
                {
                    events[l] = new ManualResetEvent(false);
                    Runner r = new Runner(events[l], innercount);
                    new Thread(new ThreadStart(r.Run)).Start();
                    Console.WriteLine("running start...{0}", innercount);
                    k++;
                    innercount++;
                }
            }
            WaitHandle.WaitAny(events);
            k--;
            Console.WriteLine("Decrement counter...{0}", k);
        }
        while (innercount < processes);

        WaitHandle.WaitAll(events);

        Console.WriteLine("All finished!");

        Console.ReadLine();

    }
}
 class Runner
{
    static readonly object rngLock = new object();
    static Random rng = new Random();

    ManualResetEvent ev;
    int id;

    internal Runner(ManualResetEvent ev, int id)
    {
        this.ev = ev;
        this.id = id;
    }

    internal void Run()
    {

            int sleepTime;
            lock (rngLock)
            {
                sleepTime = rng.Next(2000);
            }
            Thread.Sleep(sleepTime);
            Console.WriteLine("Thread Runner {0}",
                               id);
            if (ev.Set())
            {
                Console.WriteLine("release thread...{0}", id);
            }
    }
}

我必须运行多个线程。如果一个线程完成,则启动另一个线程。问题是它同时启动所有进程。(似乎这种情况无法正常工作 WaitHandle.WaitAny(events);)

1:如果有20个线程正在运行,那么当一个线程从20s线程中释放时,第21个线程将开始。

2:不使用线程池可以使用EventWaitHandler来完成。

最佳答案

可以使用PLinq和WithDegreeOfParallelism做一些事情.

WithDegreeOfParallelism 将限制同时运行的线程数量。

以下示例演示如何使用 Plinq 运行多个具有有限并行性的工作线程,并将不同的对象传递给每个工作线程。

它假设您从一系列对象开始,并且您希望将每个对象传递给工作方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

namespace Demo
{
    class DataForWorker
    {
        public int ID;
        public string Value;
    };

    class Program
    {
        Random rng = new Random();
        int numberOfThreadsRunning;

        void Run()
        {
            int maxThreads = 8;

            IEnumerable<DataForWorker> dataForWorkers = getDataForWorkers();

            dataForWorkers
                .AsParallel()
                .WithDegreeOfParallelism(maxThreads)
                .ForAll(worker);
        }

        IEnumerable<DataForWorker> getDataForWorkers()
        {
            // Just return some dummy data.

            int numberOfDataItems = 30;

            return Enumerable.Range(1, numberOfDataItems).Select
            (
                n => new DataForWorker
                {
                    ID = n,
                    Value = n.ToString()
                }
            );
        }

        void worker(DataForWorker data)
        {
            int n = Interlocked.Increment(ref numberOfThreadsRunning);
            Console.WriteLine("Thread " + data.ID + " is starting. #threads now = " + n);
            Thread.Sleep(rng.Next(1000, 2000));
            Console.WriteLine("Thread " + data.ID + " is stopping.");
            Interlocked.Decrement(ref numberOfThreadsRunning);
        }

        static void Main()
        {
            new Program().Run();
        }
    }
}

关于c# - 如何在不使用 threadPool 和使用 EventWaitHandler 进行处理的情况下运行线程束中的进程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16851936/

相关文章:

C# HttpWebRequest 获取页面总大小

c# - LINQ 查询返回错误 "The expected type was ' System.Int3 2' but the actual value was null."

java - 从线程启动新线程

java - Android:如何从主线程创建消息并将其传递给工作线程

c# - 使用EventWaitHandle类

c# - 对 EventWaitHandle 的名称感到困惑

c# - 我将如何同步运行异步 Task<T> 方法?

java - 中断异常与 while 循环中的 isInterrupted

c# - 告诉正在执行循环的线程跳出循环并执行其他操作的正确方法是什么?

c# - Azure Functions C# Http 触发器不返回响应