vb.net异步

一、无传入参数,无返回参数

  1. 写法1

    Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim t1 As Task = Task.Run(Sub()

    Dim RetS As String = ""

    For i As Integer = 0 To 90000

    RetS += "iiiiiiiiii"

    Next

    File.WriteAllText("2.txt", RetS)

    End Sub)

    Await t1

    End Sub

  2. 写法2

    Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim t2 As Task = Task.Run(New Action(AddressOf mWriteText))

    Await t2

    End Sub

    Public Sub mWriteText()

    Dim RetS As String = ""

    For i As Integer = 0 To 90000

    RetS += "iiiiiiiiii"

    Next

    File.WriteAllText("2.txt", RetS)

    End Sub

二、带传入参数,带返回参数

  1. 写法1

    Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    Dim t5 = Await WriteAllText(90000)

    Me.Text = t5

    End Sub

     

    Public Async Function WriteAllText(ByVal mCount As Integer) As Task(Of String)

    Return Await Task.Run(Function()

    Return mWriteText(mCount)

    End Function)

    End Function

     

    Public Function mWriteText(ByVal mCount As Integer) As String

    Dim RetS As String = ""

    For i As Integer = 0 To mCount

    RetS += "iiiiiiiiii"

    Next

    File.WriteAllText("2.txt", RetS)

    Return DateTime.Now.ToString("HH:mm:ss")

    End Function

  2. 写法2

    Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    Dim t4 As Task(Of String) = Task.Run(Function()

    Return mWriteText(90000)

    End Function)

    Dim t5 As String = Await t4

    Me.Text = t5

    End Sub

     

    Public Function mWriteText(ByVal mCount As Integer) As String

    Dim RetS As String = ""

    For i As Integer = 0 To mCount

    RetS += "iiiiiiiiii"

    Next

    File.WriteAllText("2.txt", RetS)

    Return DateTime.Now.ToString("HH:mm:ss")

    End Function

  3. 写法3

    Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    Dim t3 As Task(Of String) = Task.Run(Function()

    Dim RetS As String = ""

    For i As Integer = 0 To 90000

    RetS += "iiiiiiiiii"

    Next

    File.WriteAllText("2.txt", RetS)

    Return DateTime.Now.ToString("HH:mm:ss")

    End Function)

    Dim t5 As String = Await t3

    Me.Text = t5

    End Sub

三、多任务等待

Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

Dim tasks As New List(Of Task(Of String))()

Dim t1 As Task(Of String) = WriteAllText(10000)

tasks.Add(t1)

Dim t2 As Task(Of String) = WriteAllText(20000)

tasks.Add(t2)

Dim t3 As Task(Of String) = WriteAllText(30000)

tasks.Add(t3)

 

Dim kk() As String = Await Task.WhenAll(tasks)

Me.Text = kk(0) + "," + kk(1) + "," + kk(2)

 

End Sub

 

Public Async Function WriteAllText(ByVal mCount As Integer) As Task(Of String)

Return Task.Run(Function()

Return mWriteText(mCount)

End Function)

End Function

 

Public Function mWriteText(ByVal mCount As Integer) As String

Dim RetS As String = ""

For i As Integer = 0 To mCount

RetS += "iiiiiiiiii"

Next

File.WriteAllText("2.txt", RetS)

Return DateTime.Now.ToString("HH:mm:ss")

End Function

四、更新UI界面

Task.Run里面的函数是线程函数,直接更新会报错,下面使用IProgress(Of T)来辅助显示进度条

Dim progressT As IProgress(Of Integer)

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

progressT = New Progress(Of Integer)(AddressOf ProReport)

End Sub

Public Sub ProReport(ByVal i As Integer)

ProgressBar1.Value = i

End Sub

Private Async Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

Dim t3 As Task(Of String) = WriteAllText(30000, progressT)

Me.Text = Await t3

End Sub

 

 

Public Async Function WriteAllText(ByVal mCount As Integer, mprogressT As IProgress(Of Integer)) As Task(Of String)

Return Await Task.Run(Function()

Return mWriteText(mCount, mprogressT)

End Function)

End Function

 

Public Async Function mWriteText(ByVal mCount As Integer, mprogressT As IProgress(Of Integer)) As Task(Of String)

Dim RetS As String = ""

For i As Integer = 0 To mCount

RetS += "iiiiiiiiii"

Dim Precent As Integer = (i / mCount) * 100

Await Task.Delay(2000)

mprogressT.Report(Precent)

'ProgressBar1.Value = Precent

Next

File.WriteAllText("2.txt", RetS)

Return DateTime.Now.ToString("HH:mm:ss")

End Function

 

注:在Task.Run中,不建议用sleep函数来延时。建议使用Await Task.Delay(2000)

 

 

 

 

 

 

 

posted @ 2022-09-13 17:48  ihh2021  阅读(165)  评论(0编辑  收藏  举报