【发布时间】:2009-05-27 20:21:45
【问题描述】:
我编写了一个小型的内部 C# 程序,它可以在各种文件格式之间进行批量转换,主要依赖于其他 API。目前,UI 会生成一个 BackgroundWorker(不是线程)来处理转换,然后在队列中填充请求,这些请求会在 worker 完成作业时清空。队列对象本身非常小(3 个字符串告诉工作人员该做什么)并且不会对程序的内存占用有很大贡献。我的内存管理相当严格(在完成图像后处理它们,并在某些时候手动进行垃圾收集。)不过,该程序往往一次使用大约 100 MB 的内存,并且使用大约 50%总 CPU 时间。似乎如果我天真地实现线程,它会很快耗尽系统内存(除非 CLR 做了某种我不知道的魔法。)
除了捕获 OutOfMemory 异常并回滚死掉的线程之外,是否有一种简单/有效的方法来生成线程以防止系统内存不足(看起来效率很低,但是如果不使用大量的内存)?
【问题讨论】:
-
我们在讨论多少个线程?您提到了 UI 和一名工作人员……但这不应该是一个大问题;你在产生 很多 个线程吗?
-
我目前有一个 BackgroundWorker 对象(不是线程)。我想添加更多以允许更高的 CPU 利用率但防止系统内存不足。就像我说的,一个工作人员的 UI 占用了 100 MB 的内存,所以即使再添加几个线程也可能是个问题。批处理作业通常可以超过 100 个文件。
标签: c# multithreading memory