C# 使用线程加速进程

C# 使用线程加速进程,c#,multithreading,console-application,C#,Multithreading,Console Application,我继承了一个有一长串项目的应用程序 这花了几个小时来循环,所以我想我可以通过运行线程来优化它 例如: foreach (var d in data) { try { // do alot of logic, takes time } catch (Exception e) { // ca

我继承了一个有一长串项目的应用程序

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

例如:

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

            }

        }
我想我可以通过以下方式对其进行优化:

        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();

    }
虽然在foreach循环中设置断点时,我仍然注意到它会等待每个项目完成,然后再继续下一个项目。 这显然不是我想要的,因为我希望这个列表能够运行 通过循环,我将有多个项目同时拥有自己的线程

我如何做到这一点

澄清:

循环开始

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

项目2不等待项目1,而是获取其自己的线程和executs 逻辑等


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

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)
    {
        // ...
    }
}
C#将自动使用合理数量的线程,以匹配处理器上可用的内核数量


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

Parallel.Foreach
。请注意,您的逻辑必须是线程安全的。它不是多线程的,因为对于您处理的数据中的每一项,您将等待它通过
连接计算完成,这样您就不会同时计算多个项目time@litelite有没有办法绕过这个问题?@BenderBending只有在你启动完所有线程后才能等待。或者使用
Parallel.ForEach
,就像Jeroen建议的那样,感谢我的评论,可以举个例子吗?谢谢编辑:有了一份工作副本,我知道我需要删除“连接”,但我需要如何修改流程的其余部分?我很好奇,在@Jeroem Mostert types的评论中,“小心你的逻辑必须是线程安全的”如果我想使用Parallel.ForEach,那么什么能使逻辑线程安全?@Ra3IDeN确保你的数据不会被两个线程同时更改。好吧,我用Parallel.ForEach发泄,它运行得很快。虽然有些断点从未被命中,但我担心代码永远不会到达目的地。我捕获了所有错误,每个断点都很好,但某些断点根本就没有命中。使用此工具时我遗漏了什么?我们无法为您调试@ra3ide没有一件事能让你发现断点,那就是你可能会从一个线程跳到另一个线程,所以断点似乎没有按顺序执行。
Parallel.ForEach(data, (datum) =>
{
    try
    {
        // Do your logic
    }
    catch (Exception e)
    {
        // ...
    }
});