0

以下のコードを使用して、Windows サービスの 2 番目のインスタンスを制限しようとしましたが、以下のコードが機能しません。誰か助けてください。最初のインスタンスが開始されて実行されている場合、サービスを実行するための時間間隔、つまり 5 ミントを設定しました。

static class Program
{
    [STAThread]
    static void Main()
    {

     bool ok;
     System.Threading.Mutex m = new System.Threading.Mutex(true, "ImageImportService", out ok);
        if (!ok)
        {
            return;
        }
        GC.KeepAlive(m);
        if (PriorProcess() != null)
        {
            return;
        }
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
            { 
                new ImageImportService() 
            };
        ServiceBase.Run(ServicesToRun);
    }
    public static Process PriorProcess()
    {
        Process curr = Process.GetCurrentProcess();
        Process[] procs = Process.GetProcessesByName(curr.ProcessName);
        foreach (Process p in procs)
        {
            if ((p.Id != curr.Id) && (p.MainModule.FileName == curr.MainModule.FileName))
                return p;
        }
        return null;
    }
}
4

1 に答える 1

1

Windows のコンポーネントである Service Control Manager では、既に実行されている Windows サービスを開始することはできません。それだけに頼ってください。

あなたがする必要がある主なことは、実行可能ファイルを直接起動しないことです。代わりに、コードからサービスを開始する場合はクラスを使用し、手動で開始/停止する場合ServiceControllerはコントロール パネル ( ) を使用します。services.msc

場合によっては、停止後にサービスがリソースを保持しないようにするために追加の手順を実行する必要がある場合があります。これにより、低レベルのタイムアウトまでそれ自体の後続の起動が防止されます。しかし、あなたの質問には、そのような問題 (TCP ポートの再バインドなど) に既に遭遇したことを示すものは何もありません。

于 2013-03-25T08:23:27.680 に答える