C# 由于高速网络,应用程序在获取进程输出时卡住
我有一个捕获(使用wireshark)数据包的应用程序,我想在表单上显示正在接收的数据包的数量 代码: 这个类启动Tshark并从主窗体开始捕获我更改了这个ProgressChanged,它对类属性进行采样,以便在我的窗体上显示数据包编号,问题是,如果我在网络上使用高速率(BitTorrent下载),我的窗体卡住,也许我可以通过每隔几秒钟采样一次类属性来解决这个问题C# 由于高速网络,应用程序在获取进程输出时卡住,c#,winforms,C#,Winforms,我有一个捕获(使用wireshark)数据包的应用程序,我想在表单上显示正在接收的数据包的数量 代码: 这个类启动Tshark并从主窗体开始捕获我更改了这个ProgressChanged,它对类属性进行采样,以便在我的窗体上显示数据包编号,问题是,如果我在网络上使用高速率(BitTorrent下载),我的窗体卡住,也许我可以通过每隔几秒钟采样一次类属性来解决这个问题 private void bgWSniffer_ProgressChanged(object sender, ProgressCh
private void bgWSniffer_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
tshark = e.UserState as Tshark;
lbl.Text = tshark._packetsCount.ToString();
lbl.Text = tshark._packet;
}
我知道有问题的行是OnPacketProgress(_packetscont++)
启动捕获的“我的开始”按钮:
private void btnStartCapture_Click(object sender, EventArgs e)
{
lblStatusSnifferTab2.Text = "Listening on ip address " + lblIpAddressSnifferTab2.Text;
timerSniffer.Start();
btnStartTabSniffer.Enabled = false;
btnStopTabSniffer.Enabled = true;
groupBoxSelectTabSniffer.Enabled = false;
groupBoxOptionsSnifferTab.Enabled = false;
groupBoxCaptureFilesTabSniffer.Enabled = false;
groupBoxStopCaptureSnifferTab.Enabled = false;
bgWorker = new BackgroundWorker();
bgWorker.WorkerReportsProgress = true;
bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWSniffer_ProgressChanged);
bgWorker.DoWork += new DoWorkEventHandler(
(s3, e3) =>
{
tshark = new Tshark(2, pcapFilePathSniffer);
tshark.evePacketProgress += new Tshark.dlgPackProgress(
(packet) =>
{
bgWorker.ReportProgress(packet, tshark);
});
tshark.startTheCapture();
});
bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
(s3, e3) =>
{
groupBoxSelectTabSniffer.Enabled = true;
groupBoxCaptureFilesTabSniffer.Enabled = true;
});
bgWorker.RunWorkerAsync();
}
一个解决方案是这样做(使用毫秒,这样您就可以进行精细控制,如果您只需要秒,那么您可以使用TotalSeconds):
另外,我还注意到,在调用OnPacketProgress时使用post increment。这将传递_packetscont的当前值,然后在OnPacketProgress返回后将其递增。你应该仔细检查这是否是你想要的。你的问题没有道理。请重写这个问题?为什么没有意义?我知道表单被卡住了,因为它的更新速度太快,我正在寻找解决方案。您必须将用于运行流程的代码移动到单独的线程中。然后,当您必须更新表单时(请确保调用),我可以举个例子说明如何进行更新吗?(我是新开发人员)我添加了在_packet=myStreamReader.ReadLine()之后的while中启动capturinginside的开始按钮;我正在寻找行帧编号:X(数据包编号),当我捕捉到这一行时,我想将数据包计数增加1,但没有成功。谢谢,我的进程的输出是一个行块,其中一行表示数据包编号-->帧编号:X,我想解析这个数字,并每隔几秒钟将其移动到我的表单中,但是我不知道为什么我的while循环不能进入if语句,尽管该行以帧编号开始:
private void btnStartCapture_Click(object sender, EventArgs e)
{
lblStatusSnifferTab2.Text = "Listening on ip address " + lblIpAddressSnifferTab2.Text;
timerSniffer.Start();
btnStartTabSniffer.Enabled = false;
btnStopTabSniffer.Enabled = true;
groupBoxSelectTabSniffer.Enabled = false;
groupBoxOptionsSnifferTab.Enabled = false;
groupBoxCaptureFilesTabSniffer.Enabled = false;
groupBoxStopCaptureSnifferTab.Enabled = false;
bgWorker = new BackgroundWorker();
bgWorker.WorkerReportsProgress = true;
bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWSniffer_ProgressChanged);
bgWorker.DoWork += new DoWorkEventHandler(
(s3, e3) =>
{
tshark = new Tshark(2, pcapFilePathSniffer);
tshark.evePacketProgress += new Tshark.dlgPackProgress(
(packet) =>
{
bgWorker.ReportProgress(packet, tshark);
});
tshark.startTheCapture();
});
bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
(s3, e3) =>
{
groupBoxSelectTabSniffer.Enabled = true;
groupBoxCaptureFilesTabSniffer.Enabled = true;
});
bgWorker.RunWorkerAsync();
}
DateTime lastUpdate = DateTime.MinValue;
while (!myStreamReader.EndOfStream)
{
_packet = myStreamReader.ReadLine();
//if (_packet.StartsWith("Frame Number: "))
//{
// string[] arr = _packet.Split(' ');
// _test = int.Parse(arr[2]);
// _packetsCount++;
//}
// If more than one second
if((DateTime.Now - lastUpdate).TotalMilliseconds > 1000)
{
lastUpdate = DateTime.Now;
OnPacketProgress(_packetsCount++);
}
}