【发布时间】:2016-08-02 18:33:47
【问题描述】:
我正在研究将一个相对较小的服务从 C++ 重写为 C# 的可能性。该服务有两个主要功能:
- 不时执行 HTTP 请求。它们涉及一些高级任务,例如 JSON 编码/解码、base64 编码/解码和 HTTP 请求本身,而 C++ 在这些方面并不出色;
- 执行许多具有严格截止日期的实时音频相关任务,而 C# 在这些任务中表现不佳。
实时任务由一个单独的库处理,该库执行自己的线程处理,几乎不与服务的其余部分交互。服务的其余部分每 5 分钟左右向它提供一点点数据,这些数据是从 HTTP 请求中获得的。
问题是,由于实时部分有严格的截止日期,我真的不能容忍库线程上的 GC 暂停。在我自己的代码方面,应该有足够的时间让 GC 在 Web 请求之间运行,但我不能容忍它在我尝试向库提供数据时启动。
我found 表示我可以创建一个临界区,其中垃圾收集器不会使用GC.TryStartNoGCRegion() 启动,这解决了一半的问题。
但是,我仍然不知道是否有办法告诉 .NET GC 不理会不运行托管代码的特定线程。这可能吗?
【问题讨论】:
-
见this post。它带有各种警告。
-
@ScottHannen,我也偶然发现了它(我在关于 GC.TryStartNoGCRegion 的段落中链接到它)。我认为它没有显示任何关于从垃圾收集中排除线程的信息。
-
CLR 无法挂起正忙于运行本机代码的线程。也不必,在运行此类代码时,没有对象根可以更改。因此,无需“询问”,只需确保您的时间关键代码是本机代码,并且在执行其工作时它不会返回到托管方法,并且不会出错。
-
@HansPassant,这在任何地方都有记录吗?如果是,那将是一个有效的答案。
-
@HansPassant,我发现“Fundamentals of Garbage Collection”记录了工作站式垃圾收集的行为。
标签: c# .net multithreading garbage-collection