这样的循环如何才能放到另一个线程里,结果在RichTextBox1中显示。
上一个问题问的是列举出指定位数所有的数字和字母组合的问题,在此感谢高手们的解答。
新问题出现了,我想把这个循环的过程放到一个线程里,最后将结果显示到RichTextBox1控件中。在循环的过程中在进度条控件显示进度。
否则循环过程中,窗体处于冻结状态,无法响应操作。循环代码如下:
Dim Letter As String() = {" ", "0", "1", "2", "3", "4", _
"5", "6", "7", "7", "9", "a", _
"b", "c", "d", "e", "f", "i", _
"j", "k", "l", "m", "n", "o", _
"p", "q", "r", "s", "t", "u", _
"v", "w", "x", "y", "z"}
Dim aaa As String
Dim query = From x In Letter From y In Letter _
From z In Letter Where x + y + z <> " " + (x + y + z).Trim() Select (x + y + z).Trim
For Each s In query
aaa = aaa & "|" & s.ToString
Next
Me.RichTextBox1.Text = aaa
[解决办法]
避免程序挂起可以使用多线程。
http://download.csdn.net/detail/caozhy/4832657
如果要实现进度,得使用Linq Rx了。
[解决办法]
不多说废话,直接上代码,需要定义1个backgroundworker控件,一个进度条progressbar1,一个按钮button1,一个Richtextbox。
'单击按钮,开始计算
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
bgWorker.RunWorkerAsync()
End Sub
'启动后台线程,开始计算
Private Sub bgWorker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork
e.Result = Test()
End Sub
'报告进度
Private Sub bgWorker_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles bgWorker.ProgressChanged
ProgressBar1.Value = e.ProgressPercentage
End Sub
'显示计算结果
Private Sub bgWorker_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgWorker.RunWorkerCompleted
RichTextBox1.Text = e.Result
End Sub
'后台的计算程序
Function Test() As String
Dim Letter As String() = {" ", "0", "1", "2", "3", "4", _
"5", "6", "7", "7", "9", "a", _
"b", "c", "d", "e", "f", "i", _
"j", "k", "l", "m", "n", "o", _
"p", "q", "r", "s", "t", "u", _
"v", "w", "x", "y", "z"}
Dim aaa As New System.Text.StringBuilder
Dim query = From x In Letter From y In Letter _
From z In Letter Where x + y + z <> " " + (x + y + z).Trim() Select (x + y + z).Trim
Dim n As Long = query.Count
Dim i As Long = 0
For Each s In query
i += 1
aaa = aaa.Append(s & "
[解决办法]
")
bgWorker.ReportProgress(i / n * 100)
Next
Return aaa.ToString
End Function
顺便指出下,大型循环中采用 aaa = aaa & "
[解决办法]
" & s.ToString 直接导致效率低下,改用Stringbuilder可大幅度提高效率
[解决办法]
不好意思,上述代码中aaa = aaa.Append(s & "
[解决办法]
")应为aaa.Append(s & "
[解决办法]
")
[解决办法]
BackgroundWorker后台采用的还是Threading,如果使用Threading的话,必须自己编写委托实现跨线程的调用。如果仅仅是为了显示进度和返回信息,BackgroundWorker够用了