C# 由于高速网络,应用程序在获取进程输出时卡住

C# 由于高速网络,应用程序在获取进程输出时卡住,c#,winforms,C#,Winforms,我有一个捕获(使用wireshark)数据包的应用程序,我想在表单上显示正在接收的数据包的数量 代码: 这个类启动Tshark并从主窗体开始捕获我更改了这个ProgressChanged,它对类属性进行采样,以便在我的窗体上显示数据包编号,问题是,如果我在网络上使用高速率(BitTorrent下载),我的窗体卡住,也许我可以通过每隔几秒钟采样一次类属性来解决这个问题 private void bgWSniffer_ProgressChanged(object sender, ProgressCh

我有一个捕获(使用wireshark)数据包的应用程序,我想在表单上显示正在接收的数据包的数量

代码:

这个类启动Tshark并从主窗体开始捕获我更改了这个ProgressChanged,它对类属性进行采样,以便在我的窗体上显示数据包编号,问题是,如果我在网络上使用高速率(BitTorrent下载),我的窗体卡住,也许我可以通过每隔几秒钟采样一次类属性来解决这个问题

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++);
        }
    }