Как реализовать мьютекс в сервисе windows - PullRequest
1 голос
/ 13 февраля 2020

Здравствуйте, я новичок в потоках topi c, мне нужно добавить Mutex в мой сервис windows, потому что всякий раз, когда я его запускаю, он появляется снова и снова с awesome.exe, что fantasti c. бит открывается, если он закрыт.

Fantasti c .bat

@echo off
:1
"C:\awesome.exe"
goto :1

Я сделал C# проект для создания * Служба 1036 *, я выполнил это руководство , проследить за ним было довольно просто и вуаля! Я получил windows сервис, как и ожидалось, однако я думаю, что мьютекс будет подходящим средством, чтобы избежать многократного открытия многих процессов

MyService.cs

using System;
using System.ServiceProcess;
using System.Timers;

namespace Good_enough_service
{
    public partial class GoodService : ServiceBase
    {
        private Timer _syncTimer = null;
        public GoodService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            _syncTimer = new Timer();
            this._syncTimer.Interval = 1000;
            this._syncTimer.Elapsed +=
              new System.Timers.
                ElapsedEventHandler(this.syncTimerTicker);

            _syncTimer.Enabled = true;
        }

        protected override void OnStop()
        {

            _syncTimer.Enabled = false;
        }

        private void syncTimerTicker(object sender, EventArgs e)
        {

            System.Diagnostics.Process.Start(@"C:\fantastic.bat");
        }
    }
}

Мне удалось установить службу, но она часто всплывает, и поэтому она часто открывается мой awesome.exe

I ' Я смотрю на множество примеров использования Mutex в stackoverflow, документах Microsoft и запросах Google, однако, если честно, поскольку я очень новичок в этом топи c Я немного запутался в том, как создавать это может кто-нибудь помочь мне, как реализовать это?

Program.cs Это часть сервисного проекта

using System.ServiceProcess;

namespace Good_enough_service
{
    static class Program
    {
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                new GoodService()
            };
            ServiceBase.Run(ServicesToRun);
        }
    }
}

1 Ответ

1 голос
/ 13 февраля 2020

Учитывая, что ваша цель - просто запустить .exe и убедиться, что он продолжает работать, все, что вам нужно сделать, это использовать объект Process для непосредственного запуска исполняемого файла, а затем отслеживать его завершение с помощью HasExited имущество. Когда процесс завершается, просто запустите новый (или перезапустите существующий).

Process.HasExited Свойство

...