使用 (f.ex.) 按钮停止 C# 中的连续事件

本文关键字:连续 事件 ex 按钮 使用 | 更新日期: 2023-09-27 18:35:22

这可能

很简单,问题可能不是很好,但我正在寻找实现此目的的最佳或最有效的方法:

  1. 单击按钮将启动一个事件,然后运行一个连续 ping IP 地址的方法。ping 输出显示在文本框中。

  2. 单击同一按钮可停止 ping 任务。

这是(我认为)相关代码:

连接到 Ping 按钮的事件运行的方法:

private void pingClicked (object sender, EventArgs e) {
    pinger();
}

pinger() 方法:

private void pinger() {
    string command = "/c ping " + ipadrtextbox.Text;
    if (contchkbox.Checked) {
        command += " -t";
    }
    ProcessStartInfo procStartInfo = new ProcessStartInfo("CMD", command);
    Process proc = new Process();
    proc.StartInfo = procStartInfo;
    proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    proc.Start();
    procStartInfo.CreateNoWindow = true;
    procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    procStartInfo.RedirectStandardOutput = true;
    procStartInfo.UseShellExecute = false;
    proc.OutputDataReceived += new 
    DataReceivedEventHandler(proc_OutputDataReceived);
    proc.Start();
    proc.BeginOutputReadLine();
    procStartInfo.CreateNoWindow = true;
    procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
}
void proc_OutputDataReceived(object sender, DataReceivedEventArgs e) {
    if (e.Data != null) {
        string newLine = e.Data.Trim() + Environment.NewLine;
        MethodInvoker append = () => pingoutput.AppendText(newLine);
        pingoutput.BeginInvoke(append);
    }
}

pinger 方法中的 while-loop 会导致抱怨"已在流上启动异步读取操作",因此这显然不是要走的路。

另外,我还没有找到一种方法来侦听应用程序中其他地方的按钮按下,然后使用 roc 停止任务。CancelOutputRead()。但我希望这就是任务应该停止的方式吗?

使用 (f.ex.) 按钮停止 C# 中的连续事件

将正在运行的进程保留为类的private成员,然后:

private void pingClicked (object sender, EventArgs e) {
     if( process != null && !process.HasExited )
     {
         process.CancelOutputRead()
         process.Kill();
         process=null;
     } else {
            pinger();
     }
 }