Изменить текст кнопки И функцию при нажатии?

Я создал кнопку, которая запускает процесс «CMD» и пингует конкретную машину.

Я успешно выполнил Ping и изменил текст кнопки вперед и назад после нажатия кнопки, но я не уверен, как ОСТАНОВИТЬ процесс ping (который является командой ping -t) при втором щелчке того же кнопка.

ЗДЕСЬ мой код на данный момент, который выбирает кнопку, изменяет текст при нажатии, запускает процесс и проверяет наличие ошибок. Я попытался добавить оператор «else» и сказать proc.Kill(), но он не может найти переменную proc везде, где я пытаюсь. Есть ли правильный способ сделать это?

    public void Btn_Ping_Click_1(object sender, EventArgs e)
    {

        if (Btn_Ping.Text == "Ping")
        {
            Btn_Ping.Text = "Stop Ping";
        }
        else if (Btn_Ping.Text == "Stop Ping")
        {
            Btn_Ping.Text = "Ping";
        }
        th = new Thread(thread1);
        th.Start();
    }

    public void thread1()
    {
        if (Btn_Ping.Text == "Stop Ping")
        {
            try
            {
                string command = "/c ping " + Txt_Main.Text.Trim() + " -t";
                ProcessStartInfo procStartInfo = new ProcessStartInfo("CMD", command);
                Process proc = new Process();
                proc.StartInfo = procStartInfo;
                proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                proc.StartInfo.RedirectStandardOutput = true;
                proc.StartInfo.RedirectStandardInput = true;
                proc.StartInfo.RedirectStandardError = true;
                proc.StartInfo.UseShellExecute = false;
                proc.StartInfo.CreateNoWindow = true;
                proc.OutputDataReceived += new DataReceivedEventHandler(proc_OutPutDataRecieved);
                proc.Start();
                proc.BeginOutputReadLine();
                proc.WaitForExit();

            }
            catch (Exception)
            {
                //If an error occurs within the try block, it will be handled here
            }
        }

        void proc_OutPutDataRecieved(object sender, DataReceivedEventArgs e)
        {
            if (e.Data != null)
            {
                string newLine = e.Data.Trim() + Environment.NewLine;
                MethodInvoker append = () => richTextBox1.Text += newLine;
                richTextBox1.BeginInvoke(append);
            }
        }
    }

Разве вы не можете просто объявить Process в классе и вызвать Kill в другом методе?

Simon 05.04.2019 16:17

Вторя тому, что я сказал ниже, я не могу поверить, что не подумал сделать это. Спасибо. Здесь новый разработчик, и я часто скучаю по таким мелочам :(

Cody Storch 05.04.2019 17:55
stackoverflow.com/questions/30249873/… Похоже, это означает, что запуск CMD для ping не отвечает на proc.Kill(), попробуйте вместо этого запустить его напрямую.
Thomas N 08.04.2019 08:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Объявить proc на уровне класса (а не внутри thread1). Затем добавьте к кнопке событие Click:

if (proc != null)
{
    if (!proc.HasExited)
        proc.Kill();
    proc = null;
}
else
{
    th = new Thread(thread1);
    th.Start();   
}

Ничего себе, я не могу поверить, что я не подумал просто объявить proc в классе. Угу, спасибо.

Cody Storch 05.04.2019 17:55

Я попытался сказать Process proc = new Process(); выше в классе, а также просто сказать Process proc; и инициировать его ниже, но ни один из них не работает. Первоначальный пинг просто продолжается.

Cody Storch 05.04.2019 18:34

Используйте объекты Task, а не потоки. Передайте им объекты CancelationToken следующим образом:

      private CancellationTokenSource _cts = null;

      public void Btn_Ping_Click_1(object sender, EventArgs e)
      {
         if (Btn_Ping.Text == "Ping")
         {
            _cts = new CancellationTokenSource();
            Btn_Ping.Text = "Stop Ping";
            var task = new Task(() => task1(cts.Token));
            task.Start();
         }
         else if (Btn_Ping.Text == "Stop Ping")
         {
            Btn_Ping.Text = "Ping";
            _cts.Cancel();
         }
      }

      public void task1(CancellationToken ct)
      {
         try
         {
            string command = "/c ping " + Txt_Main.Text.Trim() + " -t";
            var procStartInfo = new ProcessStartInfo("CMD", command);
            var proc = new Process {StartInfo = procStartInfo};
            proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.RedirectStandardInput = true;
            proc.StartInfo.RedirectStandardError = true;
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.CreateNoWindow = true;
            proc.OutputDataReceived += new DataReceivedEventHandler(proc_OutPutDataRecieved);
            proc.Start();
            proc.BeginOutputReadLine();
            while (!proc.WaitForExit(250))
            {
               if (ct.IsCancellationRequested)
               {
                  proc.Kill();
                  return;
               }
            }
         }
         catch (Exception)
         {
            //If an error occurs within the try block, it will be handled here
         }
      }

Другие вопросы по теме