我正在编写一个在后台运行许多线程的应用程序,它必须向主线程报告,以便它可以更新接口中的表。在过去,工作线程是普通的单独类(名为Citizen),我使用类似
之类的东西从主线程运行new Thread(new ThreadStart(citizen.ProcessActions)).Start();
其中ProcessActions函数是完成所有后台工作的主要功能。在实际启动线程之前,我会注册事件处理程序,以便Citizen线程可以将某些内容记录/报告给接口。通常,有数十个Citizen线程(大约50个),它们是相当大的类 - 每个都有自己的HTTP客户端,它浏览网页。
这是管理线程的好方法吗?可能不是,坦率地说;我很确定线程没有正常退出 - 一旦ProcessActions函数完成,我删除事件处理程序就是这样 - 随着每个新Citizen的启动,内存使用率不断上升。
管理多个(50多个)线程的最佳方法是什么?您必须经常与之沟通?我相信我不必担心Citizen变量的线程安全性如何我不会从其他线程访问它们,但它是自己的线程。
答案 0 :(得分:2)
我认为你要找的是一个线程池。 Here's an MSDN article on them这应该在C#4.0中提供。
这个想法是创建一个线程池,将其计数设置为某个高数字(比如说50),然后开始为任务分配线程。如果池需要扩展,它可以,但通过预先声明一个高数字,你可以获得所有昂贵的线程创建。
“排队”要完成的任务可能会有所帮助,并在线程可用时分配这些任务。
此外,内存泄漏很难找到,但我会从测试简单的情况开始:取出所有线程(只需从主线程中运行一个Citizen)并让它运行很长时间。如果它仍在泄漏内存,那么你的线程管理不是问题。