C# 在多个线程上执行函数

C# 在多个线程上执行函数,c#,multithreading,C#,Multithreading,我正在尝试使用线程池在多个线程上拼接工作。我想使用每个可用线程将一个数组成员的输出分配给另一个数组成员(并在程序的不同部分进行计算) 它确实可以工作,但比仅仅在单个线程上添加它们要慢得多。我的用法是错误的还是这个操作对于多线程来说太简单了 arrayI和arrayX变量在classScope中,如果不在SetNumberInput中转换它们,我无法将它们作为QueueUserWorkItem参数传递 if (layerType != 0) { for (a

我正在尝试使用线程池在多个线程上拼接工作。我想使用每个可用线程将一个数组成员的输出分配给另一个数组成员(并在程序的不同部分进行计算)

它确实可以工作,但比仅仅在单个线程上添加它们要慢得多。我的用法是错误的还是这个操作对于多线程来说太简单了

arrayI和arrayX变量在classScope中,如果不在SetNumberInput中转换它们,我无法将它们作为QueueUserWorkItem参数传递

if (layerType != 0)
        {
            for (arrayI = 0; arrayI < layerSize -1 ; arrayI++)
            {
                for (arrayX = 0; arrayX < network.Layers[layerIndex - 1].layerSize - 1; arrayX++)
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(setNeuronInput), null);

                    //Neurons[i].input[x] = _network.Layers[layerIndex - 1].Neurons[x].output;
                }

            }
        }

        //ThreadPool.GetAvailableThreads(out availableThreads, out placeHolder);
        //while (availableThreads != maxThreads)
        //{
        //    ThreadPool.GetAvailableThreads(out availableThreads, out placeHolder);
        //}
        //return;

    }



    public void setNeuronInput(object o)
    {
        try
        {
            //Console.WriteLine("Thread is working");
            Neurons[arrayI].input[arrayX] = network.Layers[layerIndex - 1].Neurons[arrayX].output;
        }
        catch(Exception e)
        {
            Console.WriteLine(e);
            Console.WriteLine("ArrayI is : " + arrayI);
            Console.WriteLine("ArrayX is : " + arrayX);
            Console.ReadLine();
        }
    }
if(layerType!=0)
{
for(arrayI=0;arrayI
并行。对于
/
并行。ForEach
执行与您尝试实现的相同操作。有没有理由不使用它们?考虑使用并行LINQ <代码> .AsPixor(<代码)>或TPL的<代码>并行。对于< /代码>和<代码>并行。除此之外,单个数组分配太小,无法有效地并行化。您想看看并行化大模块。如果你想用神经网络来做事情,考虑类库,而不是滚动你自己,除非这完全是为了学习的目的,你不关心性能。请把你的度量和测量方法添加到我从未听说过的并行问题。For/Frach,我会研究它们。我将用它来并行更复杂的计算,但我想看看我是否能在这个简单的例子中做到。我的导师想让我建立一个没有库的神经网络系统,所以我陷入了困境。就性能而言,对于用于60k图像的MNIST数据集,依次处理数据集的%15需要5.56秒,但使用上述代码处理数据集的%56133需要20秒以上。添加一大堆线程可能会降低速度(请记住,单个CPU核一次只能执行一件事(对于“一件事”的某些定义而言))。Parallel.For/Foreach将以大致最大化线程吞吐量的方式将工作转交给线程池中的线程。如果在每个线程中正在执行的工作中执行任何I/O(或类似)操作,请确保异步执行,并考虑使用AsiNC/Acess来防止线程挂起。