如何在单声道下执行应用程序的单个实例



所以,我能够在Windows上执行我的应用程序的单个实例。

[STAThread]
class method Program.Main(args: array of string);
begin
  var mutex := new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");
  if mutex.WaitOne(Timespan.Zero, true) then
  begin
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.ThreadException += OnThreadException;
    lMainForm := new MainForm;
    lMainForm.ShowInTaskbar := true;
    lMainForm.Visible := false;
    Application.Run(lMainForm);
  end
  else
    MessageBox.Show("Another copy running!!!");
end;

但是,在Mono下在Linux上运行相同的应用程序该代码根本不起作用。我可以运行多个副本。我不知道这是否与我正在像mono MyPro.exe一样在终端上启动应用程序。如果这是问题,是否需要在执行命令行之前传递一些值。

预先感谢

您需要在单声道中启用共享内存,因为Adrian Faciu提到了使您的方法起作用,但是这不是最好的方法(这是默认情况下默认情况下的原因,即使我现在不记得确切的原因)

过去我使用了两种解决方案:

  • 基于文件的锁。创建一个已知文件,将PID写入该文件。在您的应用程序中的启动时,请检查文件是否存在,以及是否存在读取PID并检查是否存在该PID的任何运行过程(以便可以从崩溃中恢复)。并在退出时删除文件(如果首先创建该文件)。缺点是,如果几乎同时启动了几个实例,则在启动时有种族条件。您可以通过文件锁定进行改进,但是您可能必须使用P/Invokes在Linux上进行适当的文件锁定(我不确定托管API会做您期望的事情)。

  • 基于袜子的锁。打开一个已知端口。优于上述的优点是您不需要进行任何清理,也没有种族条件。缺点是您需要一个固定/已知端口,并且可能同时使用其他程序。

您可能需要使用mono_enable_shm环境变量启用共享的把手:

MONO_ENABLE_SHM=1 mono MyPro.exe

阿德里安的解决方案对我有用(TM)。狂野的猜测:您是否需要中的Mono_enable_shm

相关内容

  • 没有找到相关文章

最新更新