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

标签 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 永远不会被调用,我担心它会因此在我的垃圾收集预防算法中忽略这一行。

最佳答案

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

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

请注意,这甚至无需将新的 Mutex 分配给命名变量就可以工作。

关于c# - 如何使用无限循环实现单例模式 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2134693/

相关文章:

c# - 检测 UIPickerView 何时开始滚动/仍在滚动?

c# - Azure Blob 下载 (GET) 导致 PUT 请求失败

java - 调用执行异步任务的方法的本地实例的垃圾收集

Android Activity Lifecycle和Singleton以及相互引用持久化(内存泄漏)

c# - Jon Skeet 的 Singleton 说明

c# - 使用线程连续检查值的更改

c# - 这是使用 LINQ to SQL 时的虚假警告吗?

java - "jmap -histo pid"到底打印了什么

c# - 为什么总是需要在具有 IDisposable 成员的对象上实现 IDisposable?

ios - 带有单例的 AVCaptureSession。如何管理?