使用BackgroundWorker打开不同的线程

本文关键字:线程 BackgroundWorker 使用 | 更新日期: 2023-09-27 17:50:13

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

sendQueue代码:

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

使用BackgroundWorker打开不同的线程

看起来你不需要后台工作器

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

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

让你的UI响应的任务有点复杂,你需要重组PcapFile来加载一个帧(音频?),让UI线程在剩下的时间里运行,甚至完全在后台工作。

表单设计还应该依赖于PcapFile中的事件,而不是试图在BackgroundWorker中运行