gpt4 book ai didi

c# - 除特定情况外,阻止第二个实例运行

转载 作者:行者123 更新时间:2023-12-03 13:22:40 25 4
gpt4 key购买 nike

好的,我有这个程序,我不希望它运行多个实例。因此,我现在所拥有的是它会捕获与其名称相匹配的所有实例,如果有多个实例,它会退出并让用户知道它已经在另一个实例中运行。

但是,在特殊情况下,新实例将要更改其他实例正在执行的操作,然后它将退出。我怎样才能做到这一点?

这是一个例子:
我有这个程序的时间事件。我不希望同时运行多个,因为您不能同时做两件事(对于此应用程序)。现在说一个第三方程序想要通知该线程用户正在处理其他事情,因此它再次启动该应用程序。如果应用程序已经在运行,它将更新其操作,否则将正常运行。

如何才能做到这一点?

这是我用来判断是否还有另一个实例正在运行的方法:

            string proc = Process.GetCurrentProcess().ProcessName;

Process[] processess = Process.GetProcessesByName(proc);
if (processess.Length > 1) {
MessageBox.Show("There is an instance of the Timer already running");
return;
}

最佳答案

使事情复杂化的事实是,您希望在某些情况下允许该程序的第二次调用在另一个程序正在运行时执行某些操作。使用命名的互斥锁将使您能够检测程序是否已在运行-它应该已经保留了互斥锁。您仍然需要一种与之通信的方法,以告诉正在运行的程序在第二个程序运行时执行某些操作。异步消息队列可能会起作用,您只需要让正在运行的程序定期检查它即可查看是否有任何新消息在等待。该消息将需要告诉程序如何进行更改。查看System.Threading命名空间(因为看起来您已经在使用.Net),尤其是互斥量和信号量类,以及用于消息交换的System.Messaging.MessageQueue

基本思想是:

  program start
try to acquire mutex (or semaphore)
if failed
send message via message queue to running program
exit
else

set up listener for message queue

run rest of program

监听器可以采用计时器的形式,该计时器定期到期,到期回调检查队列中的消息并相应地更新程序操作。计时器将需要自动重置,以便返回听音状态。您的程序将需要具有从计时器中断中恢复的能力,并能够根据更新的配置“重新启动”。

关于c# - 除特定情况外,阻止第二个实例运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/395430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com