C# 如果可以';你说不出吗?

C# 如果可以';你说不出吗?,c#,compact-framework,mutex,windows-mobile-6.5,C#,Compact Framework,Mutex,Windows Mobile 6.5,如果不给互斥体命名,我很难弄清楚它有多好。具体来说,我想让我的Windows Mobile 6.5应用程序成为单个实例 在这个网站上有一些关于如何做到这一点的问题和答案——最好的似乎是使用命名互斥体 -只能创建互斥锁 现在,如果互斥体没有关联的ID,它有什么好处 我错过什么了吗 如果我不能命名多个应用程序,如何使用互斥来保护它们?在compact框架本身中,没有 如果不能命名互斥锁,它有什么用 一个未命名的互斥体被称为本地互斥体。您仍然可以使用它在同一进程中的不同线程之间进行同步。像lock关键

如果不给互斥体命名,我很难弄清楚它有多好。具体来说,我想让我的Windows Mobile 6.5应用程序成为单个实例

在这个网站上有一些关于如何做到这一点的问题和答案——最好的似乎是使用命名互斥体

-只能创建互斥锁

现在,如果互斥体没有关联的ID,它有什么好处

我错过什么了吗


如果我不能命名多个应用程序,如何使用互斥来保护它们?

在compact框架本身中,没有

如果不能命名互斥锁,它有什么用

一个未命名的互斥体被称为本地互斥体。您仍然可以使用它在同一进程中的不同线程之间进行同步。像
lock
关键字这样的监视器没有相同的功能。注意,互斥锁不允许递归进入。此外,监视器不能跨AppDomain边界使用。此外,互斥体可以与有用的东西一起使用,如或
WaitAny
,其中监视器不能与这些东西一起使用

我错过什么了吗

否-在.NET CF Framework中,如果没有平台调用的帮助,您无法命名互斥对象

如果无法命名多个应用程序,如何使用互斥来保护它们

你必须给它们命名——你可以这样做,你只需要求助于一些平台调用。基于Windows CE的系统命名互斥体已有一段时间了。您可以编写一个P/Invoke调用来自己完成:

[DllImport("Coredll.dll")]
public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool initialOwner, string lpName);
并将其用作(例如)
CreateMutex(IntPtr.Zero,false,“MutexName”)

您还必须为和编写p/Invoke调用


具体来说,我想让我的Windows Mobile 6.5应用程序成为单个实例

命名互斥是一种解决方案。另一个可能适合您的解决方案是使用文件锁

  • 如果文件不存在,请在启动时创建一个名为foo.txt的文件
  • 使用获取文件的写锁
  • 另一个实例将无法获得写锁,因为第一个实例有一个锁并且不会共享它。捕获异常并终止程序,因为其中一个程序已在运行
  • 当程序关闭时,清除锁。即使进程崩溃或异常终止,也应该移除文件上的锁,以允许另一个实例启动。大概是这样的:

    FileStream stream;
    try
    {
         stream = new FileStream("lock.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
    }
    catch
    {
        MessageBox.Show("Program is already running.");
        return;
    }
    //Put your application code here.
    MessageBox.Show("Program is now running.");
    stream.Close();
    

  • 监视器(锁是语法上的糖)和互斥体之间的区别是微妙的,特别是当您查看单个进程时。获取线程可以重新输入监视器。互斥不能。因此,如果你有一个递归算法,它说异步调用某个东西(是的,这是一个人为的例子,但应该足以看出这个想法),你可以用互斥锁防止多个重叠的异步调用,但不能用监视器。

    是的,有一些简单的东西应该在.NET CF中,但不是。您只需仔细阅读MSDN文档中所有的类和方法,而不需要愚蠢的小设备图标。我想我们都应该感谢微软为我们提供了更多的工作并保证了我们的工作安全。这是一个相关的问题:这只回答了四个问题中的一个(包括标题)。“我遗漏了什么吗?”但是一个未命名的互斥器有什么用呢?@JeffreyLWhitledge补充了一些细节。可能至少值得注意的是,互斥器也比监视器慢得多。好的。但这是一个他们在CF中实现的相当死气沉沉的“互斥体”。在我看来,最好完全忽略它。如果他们不能实现一个真正的互斥体,那么我想我的重点是为什么要麻烦。他们没有做很多实现。它是createmutexapi的包装器。他们只是没有添加最有用的重载。为什么,我们只能猜测。