我构建了一个应用程序来捕获和播放 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";
}