Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 我可以为每个循环加速一个循环吗_Vb.net_Performance_For Loop_User Controls - Fatal编程技术网

Vb.net 我可以为每个循环加速一个循环吗

Vb.net 我可以为每个循环加速一个循环吗,vb.net,performance,for-loop,user-controls,Vb.net,Performance,For Loop,User Controls,这段代码看起来很简单,但运行起来需要很长时间。我做了一个只包含基本代码的示例项目,但仍然非常慢 我有一个带按钮和面板的表单。在运行时,面板会动态填充大约1700个自定义用户控件。自定义用户控件包含一个面板和一个属性。单击表单上的按钮会导致每个用户控件交换其颜色。这个动作应该一次完成,但速度太慢了,我可以看到每个用户控件一行一行地切换颜色 我是否可以暂停屏幕更新,直到每个循环的整个运行之后,而不是逐个更新每个面板 用户控制代码 Public Class ucBox Private _

这段代码看起来很简单,但运行起来需要很长时间。我做了一个只包含基本代码的示例项目,但仍然非常慢

我有一个带按钮和面板的表单。在运行时,面板会动态填充大约1700个自定义用户控件。自定义用户控件包含一个面板和一个属性。单击表单上的按钮会导致每个用户控件交换其颜色。这个动作应该一次完成,但速度太慢了,我可以看到每个用户控件一行一行地切换颜色

我是否可以暂停屏幕更新,直到每个循环的整个运行之后,而不是逐个更新每个面板

用户控制代码

   Public Class ucBox
    Private _TurnedOn As Boolean
    Public Property TurnedOn() As Boolean
        Get
            Return _TurnedOn
        End Get
        Set(ByVal value As Boolean)
            _TurnedOn = value
            If TurnedOn Then
                PnlBox.BackColor = Color.Red
            Else
                PnlBox.BackColor = Color.LightGray
            End If
        End Set
    End Property

    Private Sub PnlBox_Click(sender As Object, e As EventArgs) Handles PnlBox.Click
        If TurnedOn Then
            TurnedOn = False
        Else
            TurnedOn = True
        End If
    End Sub
End Class
表单代码

    Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Dim Rw As Int16 = 0, Col As Int16 = 0, x As Int16
        Dim Box As ucBox
        With btnTest
            .Text = "Test Me"
        End With

        While Rw < PnlMain.Height - 10
            While Col < PnlMain.Width - 10
                Box = New ucBox
                x = x + 1
                With Box
                    .Top = Rw
                    .Left = Col
                    .TurnedOn = False
                    .Name = "Box_" & x
                    Col += .Width + 4

                End With

                PnlMain.Controls.Add(Box)
                Box = Nothing
            End While
            Col = 0
            Rw += 24
            If x > 2000 Then Exit While
        End While
        Debug.Print("There are " & x & " boxes.")
    End Sub

    Private Sub btnTest_Click(sender As Object, e As EventArgs) Handles btnTest.Click
        Dim StartTime As Date = Now

        For Each b As ucBox In PnlMain.Controls
            If b.TurnedOn Then
                b.TurnedOn = False
            Else
                b.TurnedOn = True
            End If
        Next

        Debug.Print("Test took " & Now.Subtract(StartTime).TotalMilliseconds)
    End Sub
End Class
公共类表单1
私有子表单1_Load(发送方作为对象,e作为事件参数)处理Me.Load
尺寸Rw为Int16=0,列为Int16=0,x为Int16
调暗框为ucBox
用btnTest
.Text=“测试我”
以
Rw2000,则在
结束时
Debug.Print(“有“&x&”框”)
端接头
私有子btnTest\u Click(发送者作为对象,e作为事件参数)处理btnTest。单击
Dim StartTime As Date=现在
对于PnlMain.控件中的每个b As ucBox
如果b.TurnedOn那么
b、 TurnedOn=错误
其他的
b、 TurnedOn=True
如果结束
下一个
Debug.Print(“测试已完成”&Now.Subtract(StartTime.total毫秒)
端接头
末级

我很欣赏你的任何想法。

你的“ucBox”和控制面板“PnlBox”的尺寸是多少?显示1700个用户控件似乎有点太多了,但你看:。可能是我不知道vb的副本,但在c中,你可以使用并行循环@Video.baba,ucBox是15px 15px,PnlMain是1345px宽,577高。