如何让VB.NET执行循环时执行其他东西呢?

程序正在执行一个循环,那样的话程序就会卡死,不能进行其他操作(比如说按按钮),怎么样才能让程序执行循环也不会卡死呢?
还有一个问题就是:怎么让VB.NET程序实现多线程执行任务?

给你个多线程执行任务的例子
先添加BackgroundWorker1、TextBox1、Button1,都是标准控件(窗体)在工具箱中找
vb.net2008
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
BackgroundWorker1.WorkerReportsProgress = True '可以传值
BackgroundWorker1.WorkerSupportsCancellation = True '可以暂停
TextBox1.Text = "开始多任务"
Button1.Text = "0"
BackgroundWorker1.RunWorkerAsync() '调用多任务程序
End Sub
'多任务程序
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
System.Threading.Thread.Sleep(20000) '暂停时间,可以是你的非常耗时程序任务
BackgroundWorker1.ReportProgress(100) '传出0-100数值
End Sub
'接收传出数值
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
'TextBox1.Text = e.ProgressPercentage
TextBox1.Text = "结束多任务"
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Button1.Text += 1
End Sub
End Class
在启动程序后可以不停点击Button1看到数值的增加而不会卡死,20秒后TextBox1就会改成"结束多任务",实际上看你的程序是什么了,传值和接收传出数值的部分可取消追问

线程我会了可是不行啊,线程执行不了我的操作,说不能操作window消息

追答

好像很少能看到说不能操作window消息的提示,但是百度上最近好像询问类似的问题多了,实际上要么是低级错误如主程序或子程序没写完(End Sub)就嵌入了其他的子程序或直接用vb程序而不是vb.net,要么是高级错误,如使用API进行了相关操作,一般可以自己解决。
BackgroundWorker出错一般提示是不能跨线程操作。如果使用很多个线程,可以相应使用多个BackgroundWorker,如BackgroundWorker1、BackgroundWorker2,甚至可以动态生成多个BackgroundWorker控件,如果想向BackgroundWorker内传入很多值,用Object和e.Argument传值,自己网上查找“RunWorkerAsync参数问题”,实际上BackgroundWorker不能真正时时向外传递数据,除非你使用委托,关于动态生成多个控件、跨线程委托在我的空间的文章中有,具体到多个BackgroundWorker间的时时传值我没做过,实际上可以在内存中建立RamDisk盘,在上面建一个数据共享文件,哪怕是文本文件也行。所有的BackgroundWorker可能的问题就这些,其他的就超出了我的能力范围

追问

呵呵,问题解决了!回答我这一个问题,回答完我就采纳你了!
dim k
Sub ssss()
Dim I As Integer
For I = 1 to 5 Step 0
k=k+1
Next
End Sub
Dim t1 As New Threading.Thread(AddressOf ssss)
t1.Start()
其实用这几行的代码就可以实现多线程,为什么VB.NET还要专门弄个控件出来呢?控件的功能更大么?

追答

通常使用VB.NET的在我看来可分从VB、 VB6、 C转过来使用VB.NET和一开始就学VB.NET的,写出的程序方式差距很大,在VB.NET标准教程中只有BackgroundWorker,没有 New Threading.Thread(AddressOf ssss),好像是VB原本没有多线程的设置,在仿C的多线程时,可以使用Threading.Thread(AddressOf ssss)进行一个单独线程运算从而实现多线程,但也就是让cpu暂停极短的时间让其中一个单独线程运算,依次进行,据说由于不是原生的多线程方式,在cpu满负荷运行的时候有较高的出错率而且cpu的效率偏低,由于VB.NET继承了很多VB的东西,所以还允许Threading.Thread(AddressOf ssss)的存在,但VB.NET也有自己的更安全、更可靠、更高效的多线程方式

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-25
要让窗体有响应,可以在循环中调用Application.DoEvents 方法
For x = 0 To 100000
For y = 0 To 100
'Code
Next
Application.DoEvents()
Next
MsgBox(Now)
Application.DoEvents 方法http://msdn.microsoft.com/zh-cn/library/system.windows.forms.application.doevents.aspx
线程处理http://msdn.microsoft.com/zh-cn/library/3e8s7xdd.aspx追问

不行啊,线程执行不了我的操作,说不能操作window消息

追答

你是在后台线程执行循环的吗?那不会卡吧
要想好好地掌握还是到MSDN看看吧
针对Visual Basic的 多线程处理 (Visual Basic) http://msdn.microsoft.com/zh-cn/library/eed6swsx(VS.90).aspx
.Net线程处理http://msdn.microsoft.com/zh-cn/library/3e8s7xdd.aspx

第2个回答  2012-03-26
给你个提示,用外部线程,你可以到百度上搜,有很多例子
相似回答
大家正在搜