【发布时间】:2011-02-13 21:04:24
【问题描述】:
我是线程新手,想做一些类似这个问题的事情:
Speed up loop using multithreading in C# (Question)
但是,我不确定该解决方案是否最适合我,因为我希望它们继续运行并且永远不会完成。 (对于那个问题,我也在使用 .net 3.5 而不是 2.0。)
我想做这样的事情:
foreach (Agent agent in AgentList)
{
// I want to start a new thread for each of these
agent.DoProcessLoop();
}
---
public void DoProcessLoop()
{
while (true)
{
// do the processing
// this is things like check folder for new files, update database
// if new files found
}
}
ThreadPool 会是最好的解决方案,还是有更适合的解决方案?
更新:感谢所有出色的答案!我想我会更详细地解释用例。许多代理可以将文件上传到一个文件夹。每个代理都有自己的文件夹,他们可以将资产上传到(csv 文件、图像、pdf)。我们的服务(它应该是在他们上传资产的服务器上运行的 Windows 服务,请放心,我很快就会回来提出有关 Windows 服务的问题 :))如果有任何新资产,将继续检查每个代理的文件夹,如果有,将更新数据库并为其中一些创建静态 html 页面。由于他们可能需要一段时间才能上传所有内容,并且我们希望他们能够立即看到他们上传的更改,我们认为每个代理一个线程是一个好主意,因为没有代理需要等待其他人完成(我们有多个处理器,所以想使用它们的全部容量)。希望这能解释清楚!
谢谢,
安妮
【问题讨论】:
-
有点切题,但您可能希望尝试使线程更多地由事件驱动,而不是在紧密循环中运行。像这样在一个紧密的循环中运行很可能最终会破坏您的处理器并浪费资源,并且会使有实际工作要做的线程停留更长的时间。
-
更多线程不一定是答案,可能会成为问题。假设您有 20 个代理并为每个代理生成一个线程。文件 i/o 总是会成为瓶颈,因此您有 20 个线程都在不断地轮询文件系统以进行更改——这将对性能产生负面影响。这些线程中的每一个也将使用 CPU 时间进行轮询,因此在一个四核机器上,每个核心都会受到其中五个线程(假设有 20 个代理)的影响,所以一个正在做实际工作的线程(处理新的文件)将被换出以允许执行轮询。
标签: c# multithreading .net-3.5