一、线程与委托
1、为什么要用异步?
无论是MemoryStream,BufferedStream,FileStream数据流,一旦的读写开始,应用程序就会处于停滞状况。
直到数据读写完成,并返回。
文件数据的读写基本上是一种非常消耗资源的过程,处理的数据量越大,I/O对系统性能的影响就越明显。
为了避免长时间等待I/O操作使程序处理“瘫痪”状态,异步I/O就显得非常重要。
异步的实现就是使用一个新的线程来完成,主线程的任务并不影响,这样大大提高了程序的效能。
2、线程
每个程序有一个主线程,如果一个循环处于主线程中,程序在较长的循环,将出现“不响应”的情况。
线程在System.Threading中。线程创建可专用于一个功能块(方法、函数),
线程的开始用Start方法
线程的结束用Abort方法
下面感受一下线程作用:
窗体上添加两Button,两个TextBox,代码如下,点击Button1启动循环,接着点击Button2.
- Public Class Form1
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Dim i As Int32
- For i = 0 To 123451
- TextBox1.Text = i
- Next
- End Sub
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- TextBox2.Text = "终于出现奇迹"
- End Sub
- End Class
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim i As Int32
For i = 0 To 123451
TextBox1.Text = i
Next
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
TextBox2.Text = "终于出现奇迹"
End Sub
End Class
可以明显看到虽然点击了Button1,但TextBox1的内容并没有什么变化,同时,在点击Button2时,TextBox并没有内容显示。
这是因为线程正被循环一直占用,暂时无法响应Button2,直到循环完成后,它才终于忙过来处理Button2.
这会给用户造成“程序已经无响应、死了”的误会。
下面改善上面的做法,新建一个线程来专门处理循环,这样就不影响主线程响应Button2:
- Imports System.Threading
- Public Class Form1
- Dim mythread As Thread
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- mythread = New Thread(AddressOf ShowNumber) '构造线程
- mythread.Name = "myShowNumber"
- mythread.Start() '启动线程
- End Sub
- Private Sub ShowNumber()
- Dim i As Int32
- For i = 0 To 123451
- TextBox1.Text = i