使用线程来加速进程

Thu*_*3eR 2 c# multithreading console-application

我继承了一个包含很长项目列表的应用程序.

这花了几个小时来循环,所以我想我可以通过运行线程来优化它.

例:

        foreach (var d in data)
        {
            try
            {
                // do alot of logic, takes time
            }
            catch (Exception e)
            {
              // catch error

            }

        }
Run Code Online (Sandbox Code Playgroud)

我以为我可以通过以下方式优化它:

        foreach (var d in data)
        {
            try
            {
                ExecutionMethodThread(d);
            }
            catch (Exception e)
            {

            }

        }

    private  void ExecutionMethodThread(data d)
    {
        Thread thread = new Thread(() => MethodThread(d));
        thread.Start();
        thread.Join();

    }
Run Code Online (Sandbox Code Playgroud)

虽然当我在foreach循环中设置断点时,我仍然注意到它等待每个项目完成后再继续下一个.这显然不是我想要的,因为我希望这个列表只是贯穿循环,我会有多个项目有自己的线程simultaniosly.

我该如何实现这一目标?

澄清:

循环开始

第一项启动一个线程并执行逻辑

第二项不等待第一项,获得自己的线程和执行逻辑等

And*_*son 5

你需要两个循环.在第一个循环中,您将创建所有线程,并启动它们.然后在第二个循环中,您将等待所有线程完成.

var threads = new List<Thread>();
foreach (var d in data)
{
    Thread thread = new Thread(() => new MethodThread(d));
    thread.Start();
    threads.Add(thread);
}

foreach (var thread in threads)
{
    try
    {
        thread.Join();
    }
    catch (Exception e)
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这种方法仍有一些缺点.如果您要处理一万个数据项,会发生什么?您将为每个数据项创建一个线程,即使并非所有线程都可以同时运行,这意味着您将不必要地消耗资源.有一种更简单的方法来实现同样的目标:

Parallel.ForEach(data, (datum) =>
{
    try
    {
        // Do your logic
    }
    catch (Exception e)
    {
        // ...
    }
});
Run Code Online (Sandbox Code Playgroud)

C#将自动使用合理数量的线程,以匹配处理器上可用内核的数量.

警告这假设您的逻辑是线程安全的,可以并行执行.切换到Parallel.Foreach()或从Helper函数移出Join()时要非常小心.