【问题标题】:Single Instance Application OS wide with mutex具有互斥锁的单实例应用程序操作系统范围
【发布时间】:2015-08-26 15:27:23
【问题描述】:

按照描述完成:

What is the correct way to create a single-instance application?

http://www.c-sharpcorner.com/UploadFile/f9f215/how-to-restrict-the-application-to-just-one-instance/

互斥锁在用户会话中工作正常。 但是当我切换用户时它不起作用。可能是因为一个用户是域用户,而我启动程序的另一个用户是本地用户?我还没有对两个本地用户进行测试...

我只需要在计算机上拥有一个实例。

我希望互斥锁是操作系统范围的。这是一个错误的假设吗?

public partial class App : Application
{
    private static Mutex _InstanceMutex = null;

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        bool isNewMutex;
        _InstanceMutex = new Mutex(true, "{ED75DE2B-69F7-4973-A58C-3A9D49B3E48D}", out isNewMutex);
        if (!isNewMutex)
        {
            _InstanceMutex = null;
            MessageBox.Show("Only one instance allowed", "ThisApp");
            Process.GetCurrentProcess().Kill();
            Application.Current.Shutdown();
            return;
        }
        //base.OnStartup(e);
    }

    private void Application_Exit(object sender, ExitEventArgs e)
    {
        if (_InstanceMutex != null)
            _InstanceMutex.ReleaseMutex();
        //base.OnExit(e);
    }

【问题讨论】:

  • 附带说明,我建议您将现有应用程序置于前台,然后显示消息框(在其前面),或者只是将当前应用程序置于前台而不显示消息(由许多应用程序作为良好的用户体验完成)。
  • 互斥锁跨多个线程和多个进程工作。从未见过它说他们跨会话工作。
  • 它有什么“不工作”?是允许每个用户一个实例,每个用户多个实例,还是每台机器只允许一个实例?
  • 我只需要在计算机上有一个实例。
  • 您是否尝试过为互斥锁添加前缀“Global\”(根据the documentation for Terminal Servers

标签: c# .net wpf mutex


【解决方案1】:

我认为您在创建 MutexSecurity 时会希望将其传递给 Mutex。文档底部的示例显示了如何将互斥锁锁定到特定用户。另请阅读备注,有诸如全局和本地会话之类的东西,它们可能适用于您,也可能不适用于您。

Mutex Constructor (Boolean, String, Boolean, MutexSecurity) 被使用。

编辑

你也可以试试这个方法:

if(!(Mutex.TryOpenExisting("Global\\{ED75DE2B-69F7-4973-A58C-3A9D49B3E48D}", out tempMutex)))
{
   _InstanceMutex = new Mutex(true, "Global\\{ED75DE2B-69F7-4973-A58C-3A9D49B3E48D}");
   //Continue startup normally
}
else
{
   //Already exists, shutdown app
}

除非您设置互斥锁安全性,否则这不应引发异常。

【讨论】:

  • 域中的任何人都可以登录。据我了解 MutexSecurity 我需要为每个尝试收集互斥锁详细信息的用户添加一个 mutexAccessRule。对我来说,这似乎是互斥锁名称需要以“\Global”开头的最简单方法,然后我只需要对 UnauthorizedAccessException 做出反应。
  • @MarkusEgle 使用可能的非投掷解决方案进行了编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多