c# - ProgressBar 更新期间 UI 卡住

标签 c# winforms

我正在使用 Pcapdot.net DLL 将数据包缓冲区发送到我的网络适配器。我检查了我的 Wireshark 文件并收集了所有信息,例如数据包数量、持续时间等。 我的主类发送缓冲区并具有几个属性(数据包数、持续时间..)在主线程中,我正在使用 BackgroundWorker.ProgressChanged 检查此类:

            bgWoSingle = new BackgroundWorker();
            bgWoSingle.WorkerReportsProgress = true;
bgWoSingle.ProgressChanged += new ProgressChangedEventHandler(bgW_ProgressChanged);

Wireshark 文件中的每个数据包都有一个时间戳,当然我可以通过增加或减少数据包之间的时间戳以其他速率发送此缓冲区。 现在我的问题是:

我正在检查的属性之一是我已经发送了多少数据包。因为我知道我的文件包含多少数据包,所以我可以通过进度条显示进度。如果我通过删除数据包播放之间的所有延迟将发送速率更改为最大,速度会非常快,并且进度条和所有 UI 都会卡住,直到它完成所有数据包的发送。我该如何改变它?也许通过另一个线程更新我的 ProgressBar?

这是检查我类(class)的函数:

  void bgW_ProgressChanged(object sender, ProgressChangedEventArgs e)
  {
    //bla bla bla (check all Class properties)

        pcap = e.UserState as Pcap;
        progressBar1.Value = e.ProgressPercentage; //here is my progressBar update


    //bla bla bla (check all Class properties)
  }

最佳答案

您只是过于频繁地调用 ReportProgress()。如此频繁,以至于 UI 线程被调用请求淹没,无法再处理其常规职责。喜欢绘画和响应输入事件。因为当它准备好执行下一个通知时,还会有另一个调用 ProgressChanged 事件处理程序的请求,它会先执行。

您需要将其放慢到合理的速度。合理很容易定义,你这样做只是为了人眼​​。当您以超过每秒 20 次的速度执行此操作时,除了模糊之外什么也看不到。你现在已经超过了那个,每秒可能超过一千次。一种简单的方法是在调用 ReportProgress 之前只计算 50 条记录。根据需要进行调整。

关于c# - ProgressBar 更新期间 UI 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9861760/

相关文章:

c# - 数组中的相等值

c# - 如何从标准控件在 C# 中创建用户控件?

c# - 在编辑模式下更改 datagridview 单元格值

c# - 如何在不使用测量工作室的情况下将模拟测量从 National Instruments USB 6008 获取到 C# 应用程序中?

C# WPF 窗口宽度、MaxWidth、MinWidth 被忽略

c# - 我需要取消订阅我的表格中的事件吗?

c# - 如何更改字符串或 double 的文化信息

c# - 重置在组框中以编程方式创建的标签的值

c# - 帮助解决简单的 restful post 问题

c# - 具有规范布局的搜索树