作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我继承了一个包含一长串项目的应用程序。
这花了几个小时来循环,所以我想我可以通过运行线程来优化它。
示例:
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/
我是一名优秀的程序员,十分优秀!