如何使我的应用程序单例应用程序? [复制]

Posted

技术标签:

【中文标题】如何使我的应用程序单例应用程序? [复制]【英文标题】:How to make my app singleton application? [duplicate] 【发布时间】:2011-06-22 08:33:23 【问题描述】:

我有一个应用程序,但目前它不是单例应用程序。 我喜欢让它成为单例应用程序,这样它的另一个实例就不会在运行时退出。

如果可以,请回复一些示例代码。

【问题讨论】:

您应该指定是否希望每个桌面、每个登录用户、每台计算机都有一个实例...当其他选项之一更合适时,程序通常会选择“每台计算机”。 见***.com/questions/2988960/… “它的另一个实例在运行时没有退出”你是什么意思?我知道的唯一方法是新启动的程序以某种方式检查是否已经存在实例然后退出(通常在激活旧实例并可能向其发送一些消息之后)。 【参考方案1】:

这里有一些很好的示例应用程序。以下是一种可能的方法。

public static Process RunningInstance() 
 
    Process current = Process.GetCurrentProcess(); 
    Process[] processes = Process.GetProcessesByName (current.ProcessName); 

    //Loop through the running processes in with the same name 
    foreach (Process process in processes) 
     
        //Ignore the current process 
        if (process.Id != current.Id) 
         
            //Make sure that the process is running from the exe file. 
            if (Assembly.GetExecutingAssembly().Location.
                 Replace("/", "\\") == current.MainModule.FileName) 

              
                //Return the other process instance.  
                return process; 

              
          
     
    //No other instance was found, return null.  
    return null;  



if (MainForm.RunningInstance() != null)

    MessageBox.Show("Duplicate Instance");
    //TODO:
    //Your application logic for duplicate 
    //instances would go here.

许多其他可能的方式。请参阅替代方案示例。

First one.

Second One.

Third One.

【讨论】:

Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName 不要使用process。你确定不是bug?是不是这样可能会被移到外面foreach【参考方案2】:

我认为以下代码会对您有所帮助。 以下是相关链接: http://geekswithblogs.net/chrisfalter/archive/2008/06/06/how-to-create-a-windows-form-singleton.aspx

static class Program

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        /*====================================================
         * 
         * Add codes here to set the Winform as Singleton
         * 
         * ==================================================*/
        bool mutexIsAvailable = false;

        Mutex mutex = null;

        try
        
            mutex = new Mutex(true, "SampleOfSingletonWinForm.Singleton");
            mutexIsAvailable = mutex.WaitOne(1, false); // Wait only 1 ms
        
        catch (AbandonedMutexException)
        
            // don't worry about the abandonment; 
            // the mutex only guards app instantiation
            mutexIsAvailable = true;
        

        if (mutexIsAvailable)
        
            try
            
                Application.Run(new SampleOfSingletonWinForm());
            
            finally
            
                mutex.ReleaseMutex();
            
        

        //Application.Run(new SampleOfSingletonWinForm());
    

【讨论】:

【参考方案3】:

我知道的方法如下。程序必须尝试打开一个命名的互斥体。如果该互斥体存在,则退出,否则,创建互斥体。但这似乎与您的条件相矛盾,即“它的另一个实例不会在运行时退出”。无论如何,也许这也有帮助

【讨论】:

以上是关于如何使我的应用程序单例应用程序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使我的 RelativeLayout 可滚动? [复制]

UIViewController 作为单例

为啥大型本地数组会使我的程序崩溃,而全局数组却不会? [复制]

发布 MK 反向地理编码器使我的应用程序崩溃!

当我向 navigationItem 添加更多按钮时,如何使我的 navigationItem.titleView 居中?

为啥我的 ListView 使我的应用程序崩溃而不是列出我的条目?