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