我正在研究将一个相对较小的服务从C++重写到C#的可能性。该服务有两个主要功能:
实时任务由一个单独的库处理,该库执行自己的线程工作,几乎不与服务的其余部分进行交互。服务的其余部分每隔5分钟左右向它提供一小部分数据,这些数据来自HTTP请求。
问题是,由于实时部分有硬的截止日期,我真的不能容忍GC在库的线程上暂停。在我自己的代码方面,应该有足够的时间让GC在Web请求之间运行,但我也不能容忍它在我试图向库提供数据时启动。
我found说我可以创建一个临界区,在这个临界区中垃圾收集器不会开始使用GC.TryStartNoGCRegion()
,这样就解决了一半的问题。
但是,我仍然不知道是否有一种方法可以告诉.NET GC不要运行不运行托管代码的特定线程。这有可能吗?
发布于 2016-08-29 21:02:58
我没有检查它,但是,我会继承Thread,或者Task,无论你使用什么:
public class SuppressedThread : Thread
{
protected override void Finalize()
{
try
{
// kill what you want
}
finally
{
base.SupressFinalizeFinalize();
}
}
}
public class SuppressedThread : Thread, IDisposable
{
protected override void Dispose()
{
try
{
// kill what you want
}
finally
{
GC.SupressFinalize();
}
}
}
然后你就可以正常使用它了
var newThread = new SuppressedThread(DoWork);
newThread.Start(42);
你认为如何?
https://stackoverflow.com/questions/38728041
复制相似问题