如何强制执行下单的应用程序的单一实例?(How to enforce single instance

2019-07-03 14:40发布

所以,我能够在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;

然而,在单Linux上运行同一个应用程序的代码不会在所有的工作。 我能够运行多个副本。 我不知道是否有与我开始喜欢上的终端应用程序的事实,做mono MyPro.exe 。 如果是这样的问题,你需要执行命令行前必须要经过一些值。

提前致谢,

Answer 1:

您需要启用阿德里安Faciu提到让你的方法工作在单共享内存,但是这是不是最好的方法(也就是它的默认摆在首位禁用的原因,即使我现在不记得确切原因) 。

我已经使用在过去的两个解决方案:

  • 基于文件的锁。 创建一个已知的文件,写PID到该文件。 在你的应用检查启动文件是否存在,如果存在读取PID并检查是否有与PID(以便它可以从崩溃中恢复)任何正在运行的进程。 并删除在退出时文件(在创建它摆在首位的实例)。 缺点是有启动的竞争条件,如果几个实例都在同一时间推出的漂亮多了。 你可以用文件锁定改善这一点,但你可能需要使用P /调用做正确的文件锁定在Linux上(我不能完全肯定托管API会做你所期望)。

  • 一个基于迎头痛击锁。 打开一个已知的端口。 在上述的优点是,你不需要做任何清理,也没有竞争条件。 其缺点是,你需要一个固定/已知的端口,和其他一些程序可能碰巧使用的是精确端口在同一时间。



Answer 2:

您可能需要启用使用MONO_ENABLE_SHM环境变量共享句柄:

MONO_ENABLE_SHM=1 mono MyPro.exe


Answer 3:

阿德里安的解决方案对我的作品(TM)。 胡乱猜测:你需要MONO_ENABLE_SHM在这两个调用?



文章来源: How to enforce single instance of an application under mono?