C# 使用BackgroundWorker打开不同的线程

C# 使用BackgroundWorker打开不同的线程,c#,winforms,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; gr

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

看起来你不需要背景工人

     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中运行它

如果需要连续运行这些事件,为什么要在后台线程中运行它们呢?如果您需要UI具有响应性,为什么不在后台线程中运行一个循环?我可以举一个例子来说明如何做到这一点吗?@user1269592这是不可能的,请写下您是如何使用的it@user1269592若我只是调用sendQueue而不使用this.Invoke。。。交叉线程错误received@user1269592我猜你只在按钮和调试器中看到它,对吗?第一个可以安全地删除。如果我从this.InvokeMethodInvokerdelegate{…}中删除了pcapFile.sendQueue,我会看到交叉线程。但是GUI仍然冻结。请查看我的更新,现在它工作正常,但这是一种正确的方法。您可以挂接到进程上退出的事件,而不是WaitForExit。您必须确保在收到事件后立即从事件中解除挂钩,以防止内存泄漏
     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);
       }

        //...
     }