使用BackgroundWorker打开不同的线程

时间:2013-01-01 19:19:53

标签: c# winforms

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

2 个答案:

答案 0 :(得分:1)

看起来不需要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);
       }

        //...
     }

答案 1 :(得分:1)

您的UI线程很可能被阻止,因为pcapFile.sendQueue是同步的。这意味着即使您的异步循环对播放文件进行排队,UI线程也会在99.99%的时间内播放文件内容。这可能是也可能不是,因为你还没有发布PcapFile的来源。

让你的UI响应更快的任务是,你需要重新构建PcapFile以一次加载一个框架(音频?视频?)并让UI线程运行剩下的时间甚至工作完全在后台。

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