C# “catch”处理输出,以便在表单上显示它

C# “catch”处理输出,以便在表单上显示它,c#,winforms,C#,Winforms,以下是我启动流程的方法: public class Tshark { public int _interfaceNumber; public string _pcapPath; Process _tsharkProcess; public int _packetsCount; public string _packet; public string _tsharkPath = @"C:\Program Files\Wireshark\tshark.

以下是我启动流程的方法:

public class Tshark
{
    public int _interfaceNumber;
    public string _pcapPath;
    Process _tsharkProcess;
    public int _packetsCount;
    public string _packet;
    public string _tsharkPath = @"C:\Program Files\Wireshark\tshark.exe";
    public delegate void dlgPackProgress(int progress);
    public event dlgPackProgress evePacketProgress;

    public Tshark(int interfaceNumber, string pcapPath)
    {
        _interfaceNumber = interfaceNumber;
        _pcapPath = pcapPath;
    }

    public void startTheCapture()
    {
        try
        {
            _tsharkProcess = new Process();
            _tsharkProcess.StartInfo.FileName = @"C:\Program Files\Wireshark\tshark.exe";
            _tsharkProcess.StartInfo.Arguments = string.Format("-i " + _interfaceNumber);
            _tsharkProcess.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
            _tsharkProcess.StartInfo.RedirectStandardOutput = true;
            _tsharkProcess.StartInfo.UseShellExecute = false;
            _tsharkProcess.StartInfo.CreateNoWindow = true;
            _tsharkProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            _tsharkProcess.Start();
            StreamReader myStreamReader = _tsharkProcess.StandardOutput;

            while (!myStreamReader.EndOfStream)
            {
                _packet = myStreamReader.ReadLine();
                OnPacketProgress(_packetsCount++);
            }

            _tsharkProcess.WaitForExit();
        }
        catch (Exception e)
        {

        }
    }

    private void OnPacketProgress(int packet)
    {
        var handler = evePacketProgress;
        if (handler != null)
        {
            handler(packet);
        }
    }

    public void killProcess()
    {
        foreach (Process prc in System.Diagnostics.Process.GetProcessesByName("tshark"))
            {
                prc.Kill();
                prc.WaitForExit();
            }                 
    }

    private void process_OutputDataReceived(object sender, DataReceivedEventArgs arg)
    {
        string srt = arg.Data; //arg.Data contains the output data from the process...            
    }
}
方法startTheCapture从主窗体调用:

private void btnStartCapture_Click(object sender, EventArgs e)
{
    BackgroundWorker bgWorker = new BackgroundWorker();
    bgWorker.WorkerReportsProgress = true;
    bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWSniffer_ProgressChanged);
    bgWorker.DoWork += new DoWorkEventHandler(
        (s3, e3) =>
        {
            tshark = new Tshark(2, pcapFilePathSniffer);
            tshark.startTheCapture();

            tshark.evePacketProgress += new Tshark.dlgPackProgress(
                (packet) =>
                {
                    bgWorker.ReportProgress(packet, tshark);
                });
        });

    bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
        (s3, e3) =>
        {

        });

    bgWorker.RunWorkerAsync();

}
现在这也是从主窗体开始的,我已经编写了ProgressChanged,它应该会更新我的gui,但我的问题是它不起作用,我不知道为什么

private void bgWSniffer_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    tshark = e.UserState as Tshark;
    listBoxPacketsSnifferTab.Text += tshark._packet;
    lblPacketsReceived2.Text = tshark._packetsCount.ToString("#,##0");
}

在DoWorkEventHandler中,在连接evePacketProgress事件处理程序之前调用tshark.start捕获

startTheCapture方法会一直阻塞,直到wireshark进程退出,因此在运行过程中捕获的任何进度事件都将在OnPacketProgress中被忽略,因为没有事件订阅者处理程序==null

将其更改为:

bgWorker.DoWork += new DoWorkEventHandler(
    (s3, e3) =>
    {
        tshark = new Tshark(2, pcapFilePathSniffer);

        //hookup event handler before executing method
        tshark.evePacketProgress += new Tshark.dlgPackProgress(
            (packet) =>
            {
                bgWorker.ReportProgress(packet, tshark);
            });

        tshark.startTheCapture();


    });

感谢您的快速回复,我已经做了此更改,但我仍然无法进入bgWSniffer\u ProgressChanged方法,尽管过程已更改start@DanaYeger那你得提供更多的信息。如果你在打包过程中破门而入,会被呼叫吗?如果是,则handler==null吗?处理程序被正确调用了吗?若否,原因为何?startTheCapture中有bug吗?因为我是新开发人员,不明白你的意思,我已经更新了我的代码并添加了所有的类,我希望它能帮助你永远不要只说“不工作”。什么不起作用?它在做什么,应该做什么?如果您遇到错误,详细说明是什么。让我们仅仅猜测问题是什么很可能是徒劳的。