Пожалуйста, смотрите ниже код, который я адаптировано из следующей веб-странице: http://www.codeguru.com/csharp/csharp/introduction-to-async-and-await-keywords-in-c-5.0.htmОжидать причинения основного потока?
Public Class Form1
Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim program As New Program()
Await program.PrintSumAsync()
MsgBox("got here 1")
End Sub
End Class
Class Program
Public Async Function PrintSumAsync() As Task
Dim value1 As Integer = Await GetValueAsync()
Dim value2 As Integer = Await GetValueAsync()
Console.WriteLine("Sum of two random numbers is: {0}", value1 + value2)
End Function
Private Async Function GetValueAsync() As Task(Of Integer)
System.Threading.Thread.Sleep(5000)
Dim random As Integer = ComputeValue()
Return random
End Function
Private Function ComputeValue() As Integer
MsgBox("got here 2")
Return New Random().[Next](1, 1000)
End Function
End Class
я добавил вызов в режим сна в GetValueAsync так, что она занимает некоторое время, чтобы закончить.
Я ожидал, что код достигнет msgbox1 (получил здесь 1) до msgbox2 (получил здесь 2). Ожидание, кажется, останавливает основной поток. Что мне не хватает? У меня нет опыта работы с ключевым словом newish. Недавно я обновился от .NET до .NET 4.5.2.
Update основе Davids ответа я редактировал код следующим образом:
Public Class Form1
Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
test()
MsgBox("got here 1")
End Sub
Public Async Sub test()
Dim program As New Program()
Await program.PrintSumAsync()
'Dim task As Task = program.PrintSumAsync()
MsgBox("got here 2")
End Sub
End Class
Class Program
Public Async Function PrintSumAsync() As Task
Dim value1 As Integer = Await GetValueAsync()
Dim value2 As Integer = Await GetValueAsync()
Console.WriteLine("Sum of two random numbers is: {0}", value1 + value2)
End Function
Private Async Function GetValueAsync() As Task(Of Integer)
Try
Await Task.Delay(5000)
Dim random As Integer = ComputeValue()
Return random
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Function
Private Function ComputeValue() As Integer
MsgBox("got here 2")
Return New Random().[Next](1, 1000)
End Function
End Class
Как я могу остановить основной поток от отделки до того окна сообщений 2 появится?
Thanks +1. Я отредактировал вопрос, основываясь на вашем ответе. Не могли бы вы взглянуть? – w0051977
@ w0051977: Я не уверен, что задает ваш обновленный вопрос. Не отображаются ли окна сообщений в обновленном коде? Какое поведение вы видите и чего пытаетесь достичь? Мне непонятно, что вы подразумеваете под «прекращением основной нити до окончания». – David
Во втором фрагменте кода я не хочу, чтобы основной поток заканчивался, пока не закончились два асинхронных вызова. Имеет ли это смысл? – w0051977