如何用无限循环实现单例模式 - C#

时间:2010-01-25 18:47:24

标签: c# garbage-collection singleton mutex

我目前正在使用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永远不会被调用,我担心它会在我的垃圾收集防止算法中忽略这一行。

2 个答案:

答案 0 :(得分:10)

Mutex是一次性的。为什么不将它包装在using

using(new Mutex(blah, blah, blah)){
    while(true){
        Blah(blah);
    }
}

请注意,这甚至不会将新的Mutex分配给命名变量。

答案 1 :(得分:1)

你应该没事。 GC.KeepAlive的重点只是在函数的后面有一个对象的引用,因此它永远不会被释放。该框架不够聪明,不知道你的循环永远不会退出,所以它永远不会丢弃对象。