我构建一个应用程序如何获取Pcap文件(wireshark文件)并播放数据包,播放操作是用exe文件获取文件路径和接口int。
private void btnStart_Click(object sender, EventArgs e)
{
shouldContinue = true;
btnStart.Enabled = false;
btnStop.Enabled = true;
groupBoxAdapter.Enabled = false;
groupBoxRootDirectory.Enabled = false;
string filePath = string.Empty;
ThreadPool.QueueUserWorkItem(delegate
{
for (int i = 0; i < lvFiles.Items.Count && shouldContinue; i++)
{
this.Invoke((MethodInvoker)delegate { filePath = lvFiles.Items[i].Tag.ToString(); });
pcapFile = new PcapFile();
pcapFile.sendQueue(filePath, adapter);
}
this.Invoke((MethodInvoker)delegate
{
btnStart.Enabled = true;
btnStop.Enabled = false;
groupBoxAdapter.Enabled = true;
groupBoxRootDirectory.Enabled = true;
});
});
}
sendQueue代码:
public void sendQueue(string filePath, int deviceNumber)
{
ProcessStartInfo processStartInfo = new ProcessStartInfo(@"D:\Downloads\SendQueue\sendQueue.exe");
processStartInfo.Arguments = string.Format("{0} {2}{1}{2}", (deviceNumber).ToString(), filePath, "\"");
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardError = true;
processStartInfo.CreateNoWindow = true;
processStartInfo.UseShellExecute = false;
processStartInfo.ErrorDialog = false;
using (Process process = Process.Start(processStartInfo))
{
process.WaitForExit();
}
}
答案 0 :(得分:1)
看起来不需要Backgroundworker。
List<string> tags = new List<string>();
foreach (object item in lvFiles.Items)
{
tags.Add(item.tag.ToString());
}
ThreadPool.QueueUserWorkItem(delegate
{
for (int i = 0; i < tags.Count && shouldContinue; i++)
{
sendQueue(tags[i], adapter);
}
//...
}
答案 1 :(得分:1)
您的UI线程很可能被阻止,因为pcapFile.sendQueue是同步的。这意味着即使您的异步循环对播放文件进行排队,UI线程也会在99.99%的时间内播放文件内容。这可能是也可能不是,因为你还没有发布PcapFile的来源。
让你的UI响应更快的任务是,你需要重新构建PcapFile以一次加载一个框架(音频?视频?)并让UI线程运行剩下的时间甚至工作完全在后台。
表单设计还应该依赖PcapFile中的事件,而不是尝试在BackgroundWorker中运行它