如果我声明互斥量为静态(WPF),是否需要担心互斥量会被垃圾回收?

时间:2019-07-14 00:07:14

标签: c#

我一直在研究人们使用互斥体来防止其程序的多个实例的几种不同方式。在C#中使用互斥锁的问题之一似乎是随着时间的推移,垃圾收集器可能会丢弃您的互斥锁。

我在WPF项目中使用互斥体来强制执行应用程序的单个实例,如下所示:

public partial class App : Application
{
    private string UniqueMutexName = string.Format("Global\\{{{0}}}", ((GuidAttribute)Assembly.GetEntryAssembly().GetCustomAttributes(typeof(GuidAttribute), false)[0]).Value);
    private static Mutex mutex = null;

    protected override void OnStartup(StartupEventArgs e)
    {
        bool singleInstance;
        mutex = new Mutex(true, UniqueMutexName, out singleInstance);

        if (!singleInstance)
        {
            NativeMethods.PostMessage((IntPtr)NativeMethods.HWND_BROADCAST, NativeMethods.WindowsMessage.WM_INSTANCEATTEMPT, IntPtr.Zero, IntPtr.Zero);
            Current.Shutdown();
        }
        base.OnStartup(e);
    }
}

即使必须在方法中实例化互斥体,我还是将互斥体声明为静态的事实是否可以防止它被垃圾收集器丢弃,还是我需要做其他事情?我已经看到了很多东西,从人们在使用using语句中包装互斥体到使用try / finally块手动处置互斥体,但是由于我正在使用WPF并覆盖OnStartup方法,而不是编辑实际的入口点,因此我可以真的不采用这种方法。

1 个答案:

答案 0 :(得分:2)

如果一个对象因为有资格使用垃圾收集而被static实例化了,那么那里将有很多崩溃的应用程序。

另一种查看方式,如果您可以访问它(编写可以引用该引用的代码)并且未设置为null,那么它将不符合条件

  

我将互斥量声明为静态的事实是否阻止了它   被垃圾收集器处理

答案是肯定的(在通常情况下)


其他资源

Fundamentals of garbage collection