使用BackgroundWorker打开不同的线程
本文关键字:线程 BackgroundWorker 使用 | 更新日期: 2023-09-27 17:50:13
我构建了一个应用程序如何获取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();
}
}
看起来你不需要后台工作器
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);
}
//...
}
您的UI线程很可能被阻塞,因为pcapFile。sendQueue是同步的。这意味着即使你的异步循环排队播放文件,UI线程在99.99%的时间里都在忙着播放文件的内容。这可能是,也可能不是,因为你还没有发布PcapFile的源代码。
让你的UI响应的任务有点复杂,你需要重组PcapFile来加载一个帧(音频?),让UI线程在剩下的时间里运行,甚至完全在后台工作。
表单设计还应该依赖于PcapFile中的事件,而不是试图在BackgroundWorker中运行