如何确保在多线程环境中对StringBuilder对象进行GC操作?(鉴于我不能使用使用关键字)?

Uda*_*hta 1 c# stringbuilder multithreading garbage-collection using

编辑: - 如何确保StringBuilder在多线程环境中对象是GC?(鉴于我不能使用使用关键字)?

我正在使用StringBuilder多个线程,并StringBuilder为每个被调用的线程创建一个新实例.

我关注的是性能,特别是它为StringBuilder创建这么多实例所占用的内存.

有没有其他方法可以确保GC为我释放内存?(比如调用Dispose等)

编辑:StringBuilder没有实现IDisposable,所以我不能使用using关键字.

编辑:我不想强迫,GC.Collect()因为有多个线程同时运行,他们在它们之间共享资源.其中一些线程处于休眠状态,只是监听事件再次变为活动状态.

Lua*_*aan 5

不,StringBuilder没有实现IDisposable,所以它不能用using.

然而,无论如何它都无济于事.Dispose与GC无关.可能存在帮助的情况,但它实际上无法执行引用无效的任何操作 - 唯一的例外是非托管资源(必须在终结器中释放).

如果有一些托管的内部资源,Dispose可以摆脱该引用 - 但是,这不是真正的正确模式.一个Disposed对象应该是好的,所以你不应该继续引用它.

Dispose完全必要的少数情况是事件处理程序和CancellationToken(虽然在.NET 4.5中修复了泄漏).但是,在任何情况下,重点是摆脱引用,以便GC可以收集它们 - 它不会导致 GC收集它们.

如果你发现你自己做了很多操作StringBuilder(实际上它会导致性能问题!),你应该考虑重用旧版本,StringBuilders而不是找出如何更快地处理它们.您可以StringBuilder根据需要多次重复使用s,这在进行高性能字符串处理时非常方便.

在考虑应用程序性能时,尤其是在.NET等平台上,最重要的是分析.不要猜 - 测量..NET的GC实际上非常令人印象深刻,很少需要您的手动"帮助".

编辑:

至于你的编辑,如果你认为StringBuilder为每个线程创建一个太多的工作,你可能会创建更多的线程而不是合理的.如果您遇到性能问题,请考虑更好的工作安排,而不是更好的StringBuilder处理模式.没有理由让线程只是等待某个事件 - 这就是异步I/O的用途.所以事实上,没有多少理由可以拥有超过2 * CPU core线程,给予或接受.

没有办法在.NET中显式收集任何内存 - 这真的是件好事.唯一接近的是GC.Collect,但它更可能导致性能问题而不是解决它.我看到它唯一有用的地方是性能测试.它也用于WPF,它会引起非常有趣的性能问题.