gpt4 book ai didi

c# - 使用线程来加速进程

转载 作者:行者123 更新时间:2023-12-02 19:43:08 25 4
gpt4 key购买 nike

我继承了一个包含一长串项目的应用程序。

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

示例:

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

如何实现这一目标?

澄清:

Loop begins

Item one starts a thread and executs logic

item two DOES NOT WAIT for item one, gets its own thread and executs logic etc

最佳答案

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

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)
{
// ...
}
}

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

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

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

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

关于c# - 使用线程来加速进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45359516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com