Почему у меня два экземпляра одного и того же процесса? - PullRequest
0 голосов
/ 05 июня 2018

Итак, я играю с одним из моих проектов, и сейчас возникает проблема: когда я нажимаю кнопку Start, этот метод запускается.

public void Start()
        {
            if (!ServerIsRunning)
            {
                ConsoleOutput.Clear();

                pServer = new Process();
                pServer.StartInfo.FileName = "java";
                pServer.StartInfo.Arguments = @"-jar " + "-Xms512M -Xmx1G myJavaFile.jar";

                pServer.Start();
                PID = pServer.Id;

                counter = new PerformanceCounter("Process", "% Processor Time", pServer.ProcessName, true);

                timer.Interval = TimeSpan.FromSeconds(1);
                timer.Tick += timer_Tick;
                timer.Start();
            }
        }

Я создал глобальное нулевое свойстводля PerformanceCounter вот так

private PerformanceCounter counter;

И как вы можете видеть в методе запуска, именно здесь мы присваиваем ему значение.

Я создал это событие тика, а также для своего таймера, которыйобновляет свойство

void timer_Tick(object sender, EventArgs e)
        {
            FindServerProcess();
            double pct = counter.NextValue() / 10;
            ServerCPU = pct.ToString("0.0");
        }

А вот метод внутри, который находит процесс, соответствующий определенному PID

public void FindServerProcess()
{
    Process[] processes = Process.GetProcesses();
    foreach (var process in processes)
    {
        if (process.Id == PID)
        {
            Console.WriteLine("Found the process!");
        }
    }
}

Когда я нажимаю запустить его, дайте мне знать в окне вывода, что оннаходит процесс, как и ожидалось, распечатав сообщение Found the process!.

Однако .. Вот где он становится странным.Если я нажимаю кнопку остановки

private void Stop(string StopCommand) 
{
     counter.Close();
     counter = null;
     timer.Stop();
     pServer.StandardInput.WriteLineAsync(StopCommand);
}

, она закрывает счетчик, обнуляет его, и я останавливаю таймер, который вызывает событие тика.Затем я также выдаю команду, которая просто stop для потока консоли, которая просто закрывает процесс.На данный момент процесс был закрыт, я больше не вижу его в диспетчере задач.Однако, когда я нажимаю кнопку «Пуск», он начинает выводить Found the process! два раза в одно и то же время, и значение изменяемого свойства кажется двойным.Это почему?Я не закрываю собственность безопасно?Или я забыл избавиться от каких-то предметов?

1 Ответ

0 голосов
/ 05 июня 2018

Я думаю, что ваша проблема с двумя строками Found the process! вызвана вашей функцией Start(), в частности, строкой:

timer.Tick += timer_Tick;

Как вы описали свои действия по нажатию, Пуск, Стоп, а затемНачните снова.Событие timer.Tick добавляется дважды (один раз при каждом запуске функции Start().

Чтобы противостоять этому, просто добавьте строку

timer.Tick -= timer_Tick;

заранее.

Всякий раз, когда вы добавляете обработчик событий во время выполнения, вы всегда должны предшествовать вызову с синтаксисом -=, чтобы удалить ранее назначенный обработчик событий (если вы действительно не хотите, чтобы он выполнялся более одного раза)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...