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吗?因为我是新开发人员,不明白你的意思,我已经更新了我的代码并添加了所有的类,我希望它能帮助你永远不要只说“不工作”。什么不起作用?它在做什么,应该做什么?如果您遇到错误,详细说明是什么。让我们仅仅猜测问题是什么很可能是徒劳的。