Release模式下的 C# 互斥量与 Debug模式下的行为不同

标签 c# debugging mutex release

所以我有以下代码:

...
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 似乎什么也没做)。

我添加了条件编译的转储,显示应用程序启动的模式以及输出根据配置而变化,但遗憾的是,应用程序的行为也是如此。

这可能是一个竞争条件,但我不确定。

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

谢谢。

最佳答案

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

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

您应该使用 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
}

关于 Release模式下的 C# 互斥量与 Debug模式下的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23525460/

相关文章:

java - 如何使用 Eclipse 调试 Spring Boot 应用程序?

c++ - 进程间通信——在共享内存中锁定互斥锁

debugging - Rubymine 调试器在配备 M1 芯片的 Macbook 上失败

java - 查询 : Why is this hashtable breaking on me?

c# 无法获取部分文件路径错误

c# - WebBrowser 组件不显示 CSS 3

c++ - 我如何为数组中的元素锁定 MUTEX,而不是为整个数组锁定

linux - 为什么在 Linux 中 spin_lock 和 spin_unlock 之间的中断被禁用?

c# - 返回引用类型的方法返回引用还是克隆副本?

java - 如何从普通图像生成 HSL 或 HSI 直方图?