0

我构建了一个应用程序来捕获和播放 Wireshark 文件并将所有数据包发送到我的网卡。在应用程序中,用户可以选择一个文件夹,该文件夹内的所有文件都将添加到一个列表框中并无限循环播放。对于我的应用程序,我使用的是 Pcapdotnet DLL,但由于 Wincap 中的一个错误,即在 500 个文件之后库尝试访问文件并且应用程序崩溃,我构建了一个 exe 文件,它将我的接口号和文件路径作为参数。文件播放完毕后,exe 文件将关闭,因此在这种情况下,我可以播放 500 多个文件而不会崩溃。

这是我的开始按钮,它开始播放列表框中的所有文件: sendQueue是我的 exe 文件,我发送文件路径

private void btnStart_Click(object sender, EventArgs e)
{
    shouldContinue = true;

    this.Invoke((MethodInvoker)delegate
    {
        btnStart.Enabled = false;
        btnStop.Enabled = true;
        groupBoxAdapter.Enabled = false;
        groupBoxRootDirectory.Enabled = false;
    });

    backGroundWorker = new BackgroundWorker();
    backGroundWorker.WorkerReportsProgress = true;
    backGroundWorker.DoWork += new DoWorkEventHandler(
    (s3, e3) =>
    {

        for (int i = 0; i < lbFiles.Items.Count && shouldContinue; i++)
        {
            this.Invoke((MethodInvoker)delegate
            {
                lbFiles.SetSelected(i, true);
                toolStripStatusLabel.Text = string.Format("Playing file no {0} of {1}", i + 1, lbFiles.Items.Count);
            });

            sendQueue((string)lbFiles.Items[i]); 
        }
    });

    backGroundWorker.RunWorkerAsync();
}

我想要做的是停止按钮,通过将 shouldContinue 布尔变量更改为 false 来停止我的播放,并关闭所有正在播放我的文件的进程(SendQueue.exe),我的问题是该进程仍在运行。

bool shouldContinue = true;

private void btnStop_Click(object sender, EventArgs e)
{
    shouldContinue = false;

    foreach (Process prc in System.Diagnostics.Process.GetProcessesByName("SendQueue"))
    {
        prc.Kill();
        prc.WaitForExit();
    }

    toolStripStatusLabel.Text = "Stop playing";
}
4

0 回答 0