调试很慢..怎么了?

时间:2021-03-13 11:42:47

标签: vb.net

我正在编写一个 VB.net 软件。在主窗体中有几个 Datagridviews 和列表框,我正在填充一些参数并将它们绘制到 XY 图表中。在所有图表的生成结束时,我必须编写,添加一些预制字符串,这些 Datagridviews/Listboxes 的一些点在另一种形式的 RichtextBox 上。所以我正在显示表单并在 Richtextbox 上附加我需要的数字的文本。我的问题是这个操作看起来很简单,但速度很慢(我在下面报告的代码部分大约需要 5 分钟),而且我经常收到 ContextSwitchDeadlock 错误(我已经从VS2019 的调试设置)。代码如下:

Form2.Show()
        Form2.RichTextBox6.AppendText("MPTEMP,,,,,,,,")
        If CDbl(TextBox1.Text) >= 55 Then
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPTEMP,1," + DataGridView9.Rows(0).Cells(0).Value.ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPTEMP,2," + DataGridView9.Rows(80).Cells(0).Value.ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPTEMP,3," + DataGridView9.Rows(180).Cells(0).Value.ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPTEMP,4," + DataGridView9.Rows(280).Cells(0).Value.ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPTEMP,5," + DataGridView9.Rows(380).Cells(0).Value.ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPTEMP,6," + DataGridView9.Rows(480).Cells(0).Value.ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPTEMP,7," + DataGridView9.Rows(580).Cells(0).Value.ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,EX,1,," + (DataGridView9.Rows(0).Cells(1).Value * 1000000).ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,EX,1,," + (DataGridView9.Rows(80).Cells(1).Value * 1000000).ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,EX,1,," + (DataGridView9.Rows(180).Cells(1).Value * 1000000).ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,EX,1,," + (DataGridView9.Rows(280).Cells(1).Value * 1000000).ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,EX,1,," + (DataGridView9.Rows(380).Cells(1).Value * 1000000).ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,EX,1,," + (DataGridView9.Rows(480).Cells(1).Value * 1000000).ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,EX,1,," + (DataGridView9.Rows(580).Cells(1).Value * 1000000).ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,PRXY,1,," + TextBox6.Text)
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,PRXY,1,," + TextBox6.Text)
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,PRXY,1,," + TextBox6.Text)
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,PRXY,1,," + TextBox6.Text)
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,PRXY,1,," + TextBox6.Text)
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,PRXY,1,," + TextBox6.Text)
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,PRXY,1,," + TextBox6.Text)
        Else
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPTEMP,1," + DataGridView9.Rows(0).Cells(0).Value.ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPTEMP,2," + DataGridView9.Rows(80).Cells(0).Value.ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPTEMP,3," + DataGridView9.Rows(180).Cells(0).Value.ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPTEMP,4," + DataGridView9.Rows(280).Cells(0).Value.ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,EX,1,," + (DataGridView9.Rows(0).Cells(1).Value * 1000000).ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,EX,1,," + (DataGridView9.Rows(80).Cells(1).Value * 1000000).ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,EX,1,," + (DataGridView9.Rows(180).Cells(1).Value * 1000000).ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,EX,1,," + (DataGridView9.Rows(280).Cells(1).Value * 1000000).ToString())
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,PRXY,1,," + TextBox6.Text)
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,PRXY,1,," + TextBox6.Text)
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,PRXY,1,," + TextBox6.Text)
            Form2.RichTextBox6.AppendText(Environment.NewLine + "MPDATA,PRXY,1,," + TextBox6.Text)
        End If
        Form2.RichTextBox6.AppendText(Environment.NewLine + "TB,MELA,1,2,3,")
        Return

很明显,当按下启动我报告的代码的按钮时,Datagridview 的值还没有计算出来,所以只需将这些字符串写入 Richtextbox。我在哪里做的事情效率不高?我怎样才能更快地得到它? 谢谢大家都来回答我。最好的问候

1 个答案:

答案 0 :(得分:0)

每次调用 .AppendText 时,您都在更新用户界面。这是一个缓慢的过程。构建字符串,然后更新 RichTextBox 一次。

为了进一步加快速度,请使用 StringBuilder。 String 是不可变的(你不能改变它)所以,如果你只使用一个普通的 String 变量,它会被丢弃并在每次添加时重新创建。 StringBuilder 不是这样。

StringBuilder 位于 System.Text 命名空间中,因此添加

Imports System.Text

到代码文件的顶部。

如果你有一个绑定到网格的数据表,在那里检索值可能会更容易

dt(80)(1)

其中dt是DataTable,80是行,1是列。行和列都从零开始。

为了使您的代码更具可读性,您可以在 Visual Studio 2015 及更高版本中使用内插字符串。它们以 $ 开头。这允许您直接内联包含由大括号 {} 包围的变量。 ToString 不是必须的,由内插器提供。

Private Sub OpCode()
    Dim sb As New StringBuilder
    sb.AppendLine("MPTEMP,,,,,,,,")
    If CDbl(TextBox1.Text) >= 55 Then
        sb.AppendLine($"MPTEMP,1,{DataGridView9.Rows(0).Cells(0).Value}")
        sb.AppendLine($"MPTEMP,2,{DataGridView9.Rows(80).Cells(0).Value}")
        sb.AppendLine($"MPTEMP,3,{DataGridView9.Rows(180).Cells(0).Value}")
        sb.AppendLine($"MPTEMP,4,{DataGridView9.Rows(280).Cells(0).Value}")
        sb.AppendLine($"MPTEMP,5,{DataGridView9.Rows(380).Cells(0).Value}")
        sb.AppendLine($"MPTEMP,6,{DataGridView9.Rows(480).Cells(0).Value}")
        sb.AppendLine($"MPTEMP,7,{DataGridView9.Rows(580).Cells(0).Value}")
        sb.AppendLine($"MPDATA,EX,1,,{(DataGridView9.Rows(0).Cells(1).Value * 1000000)}")
        sb.AppendLine($"MPDATA,EX,1,,{(DataGridView9.Rows(80).Cells(1).Value * 1000000)}")
        sb.AppendLine($"MPDATA,EX,1,,{(DataGridView9.Rows(180).Cells(1).Value * 1000000)}")
        sb.AppendLine($"MPDATA,EX,1,,{(DataGridView9.Rows(280).Cells(1).Value * 1000000)}")
        sb.AppendLine($"MPDATA,EX,1,,{(DataGridView9.Rows(380).Cells(1).Value * 1000000)}")
        sb.AppendLine($"MPDATA,EX,1,,{(DataGridView9.Rows(480).Cells(1).Value * 1000000)}")
        sb.AppendLine($"MPDATA,EX,1,,{(DataGridView9.Rows(580).Cells(1).Value * 1000000)}")
        sb.AppendLine($"MPDATA,PRXY,1,,{ TextBox6.Text}")
        sb.AppendLine($"MPDATA,PRXY,1,,{ TextBox6.Text}")
        sb.AppendLine($"MPDATA,PRXY,1,,{ TextBox6.Text}")
        sb.AppendLine($"MPDATA,PRXY,1,,{ TextBox6.Text}")
        sb.AppendLine($"MPDATA,PRXY,1,,{ TextBox6.Text}")
        sb.AppendLine($"MPDATA,PRXY,1,,{ TextBox6.Text}")
        sb.AppendLine($"MPDATA,PRXY,1,,{ TextBox6.Text}")
    Else
        sb.AppendLine($"MPTEMP,1,{ DataGridView9.Rows(0).Cells(0).Value}")
        sb.AppendLine($"MPTEMP,2,{ DataGridView9.Rows(80).Cells(0).Value}")
        sb.AppendLine($"MPTEMP,3,{ DataGridView9.Rows(180).Cells(0).Value}")
        sb.AppendLine($"MPTEMP,4,{ DataGridView9.Rows(280).Cells(0).Value}")
        sb.AppendLine($"MPDATA,EX,1,,{ (DataGridView9.Rows(0).Cells(1).Value * 1000000)}")
        sb.AppendLine($"MPDATA,EX,1,,{ (DataGridView9.Rows(80).Cells(1).Value * 1000000)}")
        sb.AppendLine($"MPDATA,EX,1,,{ (DataGridView9.Rows(180).Cells(1).Value * 1000000)}")
        sb.AppendLine($"MPDATA,EX,1,,{ (DataGridView9.Rows(280).Cells(1).Value * 1000000)}")
        sb.AppendLine($"MPDATA,PRXY,1,,{ TextBox6.Text}")
        sb.AppendLine($"MPDATA,PRXY,1,,{ TextBox6.Text}")
        sb.AppendLine($"MPDATA,PRXY,1,,{ TextBox6.Text}")
        sb.AppendLine($"MPDATA,PRXY,1,,{ TextBox6.Text}")
    End If
    sb.Append("TB,MELA,1,2,3,")
    Form2.RichTextBox6.Text = sb.ToString
    Form2.Show()
   
End Sub