因为任何时候只有一个实例,所以在实现这种功能的时候必须借助只能被独享的资源。如果我们的程序是基于某个平台的,那么就可以借助操作系统的内核对象来完成,比如Windows操作系统就提供了CreateMutex这个API来创建一个独享的内核对象。

解决方案 »

  1.   

    单例模式:
    把初始化方法设为私有,包含一个静态的自身变量,添加一个获取进程的静态方法.
    class SingletonDemo
    {
    private static SingletonDemo theSingleton = null;private SingletonDemo() {}public static SingletonDemo Instance() 
    {
    if (null == theSingleton) 
    {
    theSingleton = new SingletonDemo();
    }
    return theSingleton;
    }
    }
    初始化对象时直接调用此方法
    SingletonDemo s1 = SingletonDemo.Instance();
    SingletonDemo s2 = SingletonDemo.Instance();
    if (s1.Equals(s2))
    ...
      

  2.   

    *******************  防止程序多次执行  **************************
    public abstract class OneInstance 

    /// <summary> 
    /// 用来判断一个指定的程序是否正在运行 
    /// </summary> 
    /// <param name="appId">程序名称,长一点比较好,防止有重复</param> 
    /// <returns>如果程序是第一次运行返回True,否则返回False</returns> 
    public static bool IsFirst(string appId) 

    bool ret=false; 
    if(OpenMutex(0x1F0001,0,appId)==IntPtr.Zero) 

    CreateMutex(IntPtr.Zero,0,appId); 
    ret=true; 

    return ret; 
    }  [DllImport("Kernel32.dll",CharSet=CharSet.Auto)] 
    private static extern IntPtr OpenMutex( 
    uint dwDesiredAccess,  // access 
    int bInheritHandle,    // inheritance option 
    string lpName          // object name 
    );  [DllImport("Kernel32.dll",CharSet=CharSet.Auto)] 
    private static extern IntPtr CreateMutex( 
    IntPtr lpMutexAttributes,  // SD 
    int bInitialOwner,                       // initial owner 
    string lpName                            // object name 
    ); 
    }
    static void Main() 
    {
    //防止程序多次运行
    if(!OneInstance.IsFirst("你的程序名称"))
    {
    MessageBox.Show ("你的程序已经在运行中!!");
    return;
    } Application.Run(new Form1());
    }
      

  3.   

    主要应用System.Diagnostics名字空间中的Process类来实现
    思路,我们在运行程序前,查找进程中是否有同名的进程,同时运行位置也相同,如是没有运行该程序,如果有,就将同名的同位置的程序窗口置前.主要代码:
    public static Process RunningInstance() 

    Process current = Process.GetCurrentProcess(); 
    Process[] processes = Process.GetProcessesByName (current.ProcessName); 
    //查找相同名称的进程 
    foreach (Process process in processes) 

    //忽略当前进程 
    if (process.Id != current.Id) 

    //确认相同进程的程序运行位置是否一样. 
    if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName) 

    //Return the other process instance. 
    return process; 



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