如上所述。我正在寻找提高程序性能的建议。该程序显示大量不同颜色的数据,供用户监控整个系统信息。有超过20个主要增强版本。最近我收到了在现有程序中添加“单元闪烁”的要求。添加“单元闪烁”功能后,CPU处理从0~4%上升到18~21%。
用于数据检索。它包含多个数据网格视图。 在dgv1“detail”数据源发生更改后,dgv2将有选择地显示dgv1列,称为“summary”并设置其数据源。
Private Sub dgv1_DataSourceChanged(sender As Object, e As EventArgs) Handles dgv1.DataSourceChanged
' Get data source from dgv1
Dim dt1 As DataTable = dgvDetail.DataSource
' Select few columns from there
Dim selectedColumns As String() = New String() { ..... }
Dim dt2 As DataTable = New DataView(dt1, String.Empty, String.Empty, DataViewRowState.CurrentRows).ToTable(False, selectedColumns)
' Set dt2 back to dgv2
dgv2.DataSource = dt2
End Sub
为了在数据网格上显示不同的颜色,基于单元格值以及dgv2中的交替行颜色。我正在使用CellFormatting事件来执行此操作。下面的编码已经简化了很多。这段代码在我的程序中也完全没问题。
Private Sub dgv2_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgv2.CellFormatting
' Alternating rows color if previous row cell is different values
' When current machineNo is different that previous row, then chg color
.....
' Set colors based on values..
......
' Set colors based on values..
' Set colors based on values..
' Set colors based on values..
End Sub
最后,是时候在单元格值上添加单元格闪烁功能了。我已经创建了一个后台工作者来做魔术,添加到我的表单加载来触发这个线程。所以每0.5秒,单元格(3)(4)将闪烁不同的颜色!
Dim _OnlyTwoColorChoices As Boolean 'for blinking purpose on TV screen
Private Sub backgroundWorker_DoWork(sender As Object, e As DoWorkEventArgs) Handles backgroundWorker.DoWork
While True
If dgv2.IsDisposed Then
Return
Else
If _cellList.Count > 0 Then
If _OnlyTwoColorChoices = True Then
dgv2.Rows(3).Cells(14).Style.BackColor = Color.Pink
Else
dgv2.Rows(3).Cells(14).Style.BackColor = Color.Yellow
End If
' Set to different value so that next flash will get different color
_OnlyTwoColorChoices = Not _OnlyTwoColorChoices
End If
' Blink frequency
Thread.Sleep(500)
End If
End While
End Sub
但后来我遇到了这个性能问题。它占用了太多的CPU时间。最初我怀疑它是细胞闪烁功能。但它只有几条简单的线条。我在VS2015中使用诊断工具,以0.5秒的间隔找出每个尖峰的根本原因。它真的是后台工作者的错吗?答案是不。罪魁祸首是dgv2_CellFormatting函数。每0.5秒,它会一次又一次地触发该功能。
每次绘制每个单元格时都会发生CellFormatting事件
我已经检查过,只要有来自MS DataGridView CellFormating
的单元格绘制,就会触发默认情况下的事件我的问题是如何同时使用CellFormatting和CellBlink(后台工作者)并且没有性能问题?请注意:我没有使用后台工作器,而是使用Timer来实现单元闪烁,性能也不是更好。