我们有一种情况,我们的应用程序需要处理一系列文件,而不是同步执行此功能,我们希望使用多线程来在不同的线程之间拆分工作负载。
每项工作是:
我们想要在一个新线程上执行每个文件的工作?这是可能的,我们应该更好地使用ThreadPool或产生新的线程,记住,每项“工作”只需要30ms,但它可能需要处理数以百计的文件。
任何让这件事变得更有效率的想法都是值得感谢的。
编辑:目前我们正在使用ThreadPool来处理这个问题。如果我们有500个文件要处理,我们循环遍历这些文件,并使用QueueUserWorkItem将每个“处理工作单元”分配给线程池。
是否适合使用线程池来实现这一点?
发布于 2010-09-16 19:14:49
我建议您使用ThreadPool.QueueUserWorkItem(...),在这种情况下,线程由系统和.net框架管理。你与你自己的线程池结合的机会要高得多。所以我建议你使用.net提供的线程池。它非常容易使用,
ThreadPool.QueueUserWorkItem(new WaitCallback(YourMethod), ParameterToBeUsedByMethod); YourMethod(object o){ Your Code here... }
有关更多信息,请访问链接http://msdn.microsoft.com/en-us/library/3dasc8as%28VS.80%29.aspx
希望,这很有帮助
发布于 2010-04-20 15:54:08
我建议你有一个有限数量的线程(比如4个),然后有4个工作池。也就是说,如果你有400个文件要处理,那么每个线程平均分配100个文件。然后,您生成线程,并将它们的工作传递给每个线程,让它们运行,直到它们完成特定的工作。
你只有一定数量的I/O带宽,所以拥有太多的线程不会带来任何好处,还要记住,创建线程也需要很少的时间。
发布于 2010-04-20 17:29:53
我建议使用更高级的库,比如Parallel Extensions (PEX),而不是直接处理线程或管理线程池:
var filesContent = from file in enumerableOfFilesToProcess
select new
{
File=file,
Content=File.ReadAllText(file)
};
var processedContent = from content in filesContent
select new
{
content.File,
ProcessedContent = ProcessContent(content.Content)
};
var dictionary = processedContent
.AsParallel()
.ToDictionary(c => c.File);PEX将根据可用的核心和负载来处理线程管理,同时您可以专注于手头的业务逻辑(哇,这听起来像是商业广告!)
PEX是.Net Framework4.0的一部分,但作为the Reactive Framework的一部分,还可以使用到3.5的后端口。
https://stackoverflow.com/questions/2673448
复制相似问题