-1

我构建了一个应用程序,如何获取 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;
        });
    });
}

发送队列代码:

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();
            }
        }
4

2 回答 2

1

看起来你不需要后台工作人员。

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

        //...
     }
于 2013-01-01T19:30:36.140 回答
1

您的 UI 线程很可能被阻塞,因为 pcapFile.sendQueue 是同步的。这意味着即使您的异步循环将播放文件排入队列,UI 线程 99.99% 的时间都在忙于播放文件的内容。这可能是也可能不是,因为您还没有发布 PcapFile 的源代码。

让你的 UI 响应的任务有点复杂,你需要重组 PcapFile 以一次加载一个帧(音频?视频?),让 UI 线程在其余时间运行,甚至完全在背景。

表单设计还应该依赖来自 PcapFile 的事件,而不是尝试在 BackgroundWorker 中运行它

于 2013-01-01T19:31:00.550 回答