【问题标题】:C# mutex in release mode behaves different than in debug mode发布模式下的 C# 互斥锁的行为与调试模式下不同
【发布时间】:2014-06-24 21:10:54
【问题描述】:

所以我有以下代码:

...
private static void Main(string[] args)
{
    string file=DateTime.Now.ToFileTime().ToString();
    File.AppendAllText(file, "Mutex\r\n");

    bool CreatedNew;
    Mutex mutex=new Mutex(true, AppDomain.CurrentDomain.FriendlyName, out CreatedNew);

    if(CreatedNew)
    {
        #if DEBUG
        File.AppendAllText(file, "Launching in DEBUG mode\r\n");
        #else
        File.AppendAllText(file, "Launching in RELEASE mode\r\n");
        #endif

        //Program.Launch();
        Program.ProcessArgsAndLaunch(args);
    }
    else
    {
        File.AppendAllText(file, "Handling dupe\r\n");
        Program.HandleDuplicate();
    }
}
...

我在这里和其他网站上查看了无数文章,但都没有运气。

基本上,代码会检查应用程序的运行实例,如果有,它会切换到正在运行的实例的主窗口。如果没有,它会启动应用程序。

Debug 模式下,一切正常,当我将配置切换到Release 时,问题就开始了:应用程序总是启动(Mutex 似乎什么也没做)。

我添加了有条件编译的转储,显示应用程序在哪种模式下启动,并且输出会根据配置发生变化,但遗憾的是,应用程序的行为也是如此。

这可能是race condition,但我不确定。

如有需要,将发布更多代码。

谢谢。

【问题讨论】:

    标签: c# debugging mutex release


    【解决方案1】:

    除了 Juan 的回答之外,在调试器内部和外部启动之间的垃圾收集方面存在差异。这与 Debug 配置与 Release 配置并不完全相同,但无论如何您都应该注意这一点。

    在调试器中,局部变量将充当其整个范围的 GC 根 - 但是当您不调试时,您的 mutex 变量根本不是 GC 根,因为您不 在初始化后使用它。这意味着您的Mutex 可以立即被垃圾收集(因此本机互斥体将被释放)。

    您应该使用using 语句明确在正确的时间处理Mutex

    // Note that you don't need a variable here... you can have one if you
    // want though
    using (new Mutex(...))
    {
        // Code here to be executed while holding the mutex
    }
    

    【讨论】:

    • 非常感谢乔恩,这就是问题所在。一旦我将我的代码放入using 语句中,一切就都奏效了。你说得对,我不需要变量...
    【解决方案2】:

    如果您有一个实例作为 Debug 运行,而另一个实例作为 Release 运行,它们将不会共享同一个互斥锁,因为 AppDomain.CurrentDomain.FriendlyName 根据托管进程是否处于活动状态而有所不同。

    如此处所示:http://msdn.microsoft.com/en-us/library/ms242202.aspx

    【讨论】:

    • 抱歉,如果不清楚,我会在DebugRelease 下编译,然后从Explorer 中启动新编译的应用程序。然后我会关闭(所有)实例,清理解决方案,更改配置,然后重新编译,然后启动(再次,从Windows Explorer)...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多