我目前正在使用C#中的应用程序,该应用程序在其他方法调用的每次迭代之后使用Thread.Sleep调用在无限循环上运行。我的主要是 -
static void Main(string[] args)
{
bool isOnlyInstance = false;
Mutex mutex = new Mutex(true, "RiskMetricsSensitivitiesDatabaseLoader", out isOnlyInstance);
if (!isOnlyInstance)
{
return;
}
while (true)
{
ProcessData();
Thread.Sleep(MainLoopSleep);
}
GC.KeepAlive(mutex);
}
我已经在方法的末尾插入了KeepAlive调用,以确保单个互斥锁按预期工作,如各种网站所述。调用KeepAlive应该防止垃圾收集丢弃互斥锁,因为.NET期待预期/优化垃圾收集。
我的问题是,由于实际上对KeepAlive的调用永远不会到达,我应该在Thread.Sleep之后将它放在循环中吗?编译器警告KeepAlive永远不会被调用,我担心它会在我的垃圾收集防止算法中忽略这一行。
答案 0 :(得分:10)
Mutex
是一次性的。为什么不将它包装在using
?
using(new Mutex(blah, blah, blah)){
while(true){
Blah(blah);
}
}
请注意,这甚至不会将新的Mutex
分配给命名变量。
答案 1 :(得分:1)
你应该没事。 GC.KeepAlive的重点只是在函数的后面有一个对象的引用,因此它永远不会被释放。该框架不够聪明,不知道你的循环永远不会退出,所以它永远不会丢弃对象。