Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Zaman uyumsuz bir yöntemde, görevler oluşturulduklarında başlatılır. Await işleci, yöntem içinde görevin tamamlanmadan işlemenin devam edemeyeceği noktada, göreve uygulanır. Çoğunlukla bir görev oluşturulduğu anda beklenir, aşağıdaki örnekte gösterildiği gibi.
Dim result = Await someWebAccessMethodAsync(url)
Ancak, programınızın görevin tamamlanmasına bağlı olmayan başka işleri varsa, görevi oluşturma işlemini görevi beklemeden ayırabilirsiniz.
' The following line creates and starts the task.
Dim myTask = someWebAccessMethodAsync(url)
' While the task is running, you can do other work that does not depend
' on the results of the task.
' . . . . .
' The application of Await suspends the rest of this method until the task is
' complete.
Dim result = Await myTask
Bir görevi başlatma ve bekleme arasında, diğer görevleri başlatabilirsiniz. Ek görevler örtük bir şekilde paralel çalıştırılır, ancak ilave iş parçacıkları oluşturulmaz.
Aşağıdaki program üç asenkron web indirmesi başlatır ve ardından çağrılma sırasına göre onları bekler. Programı çalıştırdığınızda, görevlerin her zaman oluşturuldukları ve beklendikleri sırayla tamamlanmadıklarına dikkat edin. Oluşturulduklarında çalışmaya başlarlar ve yöntem await ifadelerine ulaşmadan önce bir veya daha fazla görev tamamlanabilir.
Uyarı
Bu projeyi tamamlamak için bilgisayarınızda Visual Studio 2012 veya üzeri ve .NET Framework 4.5 veya üzeri yüklü olmalıdır.
Aynı anda birden çok görevi başlatan başka bir örnek için, Task.WhenAll (Visual Basic) Kullanarak Zaman Uyumsuz İlerleme Senaryosunu Uzatma konusuna bakın.
Bu örneğin kodunu Geliştirici Kodu Örnekleri'nden indirebilirsiniz.
Projeyi kurmak için
WPF uygulaması ayarlamak için aşağıdaki adımları tamamlayın. Bu adımlar için ayrıntılı yönergeleri İzlenecek Yol: Async ve Await Kullanarak Web'e Erişme (Visual Basic) bölümünde bulabilirsiniz.
Metin kutusu ve düğme içeren bir WPF uygulaması oluşturun. düğmesini
startButtonve metin kutusunu olarak adlandırınresultsTextBox.System.Net.Http için bir referans ekleyin.
MainWindow.xaml.vb dosyasında
Importsiçin birSystem.Net.Httpdeyimi ekleyin.
Kodu eklemek için
MainWindow.xaml tasarım penceresinde, MainWindow.xaml.vb olay işleyicisini
startButton_Clickoluşturmak için düğmeye çift tıklayın.Aşağıdaki kodu kopyalayın ve MainWindow.xaml.vb gövdesine
startButton_Clickyapıştırın.resultsTextBox.Clear() Await CreateMultipleTasksAsync() resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."Kod,
CreateMultipleTasksAsyncuygulamayı yönlendiren zaman uyumsuz bir yöntemi çağırır.Projeye aşağıdaki destek yöntemlerini ekleyin:
ProcessURLAsyncbir HttpClient web sitesinin içeriğini bayt dizisi olarak indirmek için bir yöntem kullanır. Ardından destek yöntemi,ProcessURLAsyncdizinin uzunluğunu görüntüler ve döndürür.DisplayResultsher URL için bayt dizisindeki bayt sayısını görüntüler. Bu görüntü, her görevin indirilmesinin ne zaman tamamlandığını gösterir.
Aşağıdaki yöntemleri kopyalayın ve MainWindow.xaml.vb olay işleyicisinin
startButton_Clickarkasına yapıştırın.Private Async Function ProcessURLAsync(url As String, client As HttpClient) As Task(Of Integer) Dim byteArray = Await client.GetByteArrayAsync(url) DisplayResults(url, byteArray) Return byteArray.Length End Function Private Sub DisplayResults(url As String, content As Byte()) ' Display the length of each website. The string format ' is designed to be used with a monospaced font, such as ' Lucida Console or Global Monospace. Dim bytes = content.Length ' Strip off the "https://". Dim displayURL = url.Replace("https://", "") resultsTextBox.Text &= String.Format(vbCrLf & "{0,-58} {1,8}", displayURL, bytes) End SubSon olarak, aşağıdaki adımları gerçekleştiren yöntemini
CreateMultipleTasksAsynctanımlayın.Yöntem,
HttpClientiçinde GetByteArrayAsync yöntemine erişmeniz gereken birProcessURLAsyncnesnesi tanımlar.Yöntem, Task<TResult> türünde üç görev oluşturur ve başlatır; burada
TResultbir tamsayıdır. Her görev tamamlandıktan sonra görevinDisplayResultsURL'sini ve indirilen içeriğin uzunluğunu görüntüler. Görevler zaman uyumsuz olarak çalıştığından, sonuçların görüntülenme sırası bildirildiği sıraylan farklı olabilir.Bu yöntem, her görevin tamamlanmasını bekler. Her
Awaitişleci, beklenen görev tamamlanana kadar yürütmeyiCreateMultipleTasksAsyncaskıya alır. Operatör, tamamlanan her görevdekiProcessURLAsyncçağrısından dönüş değerini de alır.Görevler tamamlandığında ve tamsayı değerleri alındığında, yöntem web sitelerinin uzunluklarını toplar ve sonucu görüntüler.
Aşağıdaki yöntemi kopyalayın ve çözümünüzde yapıştırın.
Private Async Function CreateMultipleTasksAsync() As Task ' Declare an HttpClient object, and increase the buffer size. The ' default buffer size is 65,536. Dim client As HttpClient = New HttpClient() With {.MaxResponseContentBufferSize = 1000000} ' Create and start the tasks. As each task finishes, DisplayResults ' displays its length. Dim download1 As Task(Of Integer) = ProcessURLAsync("https://msdn.microsoft.com", client) Dim download2 As Task(Of Integer) = ProcessURLAsync("https://msdn.microsoft.com/library/hh156528(VS.110).aspx", client) Dim download3 As Task(Of Integer) = ProcessURLAsync("https://msdn.microsoft.com/library/67w7t67f.aspx", client) ' Await each task. Dim length1 As Integer = Await download1 Dim length2 As Integer = Await download2 Dim length3 As Integer = Await download3 Dim total As Integer = length1 + length2 + length3 ' Display the total count for all of the websites. resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf & "Total bytes returned: {0}" & vbCrLf, total) End FunctionProgramı çalıştırmak için F5 tuşunu seçin ve ardından Başlat düğmesini seçin.
Programı birkaç kez çalıştırarak üç görevi her zaman aynı sırada bitirmediğini ve bitirdikleri sıranın oluşturuldukları ve beklendikleri sıra olmadığını doğrulayın.
Örnek
Aşağıdaki kod, tam örneği içerir.
' Add the following Imports statements, and add a reference for System.Net.Http.
Imports System.Net.Http
Class MainWindow
Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
resultsTextBox.Clear()
Await CreateMultipleTasksAsync()
resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."
End Sub
Private Async Function CreateMultipleTasksAsync() As Task
' Declare an HttpClient object, and increase the buffer size. The
' default buffer size is 65,536.
Dim client As HttpClient =
New HttpClient() With {.MaxResponseContentBufferSize = 1000000}
' Create and start the tasks. As each task finishes, DisplayResults
' displays its length.
Dim download1 As Task(Of Integer) =
ProcessURLAsync("https://msdn.microsoft.com", client)
Dim download2 As Task(Of Integer) =
ProcessURLAsync("https://msdn.microsoft.com/library/hh156528(VS.110).aspx", client)
Dim download3 As Task(Of Integer) =
ProcessURLAsync("https://msdn.microsoft.com/library/67w7t67f.aspx", client)
' Await each task.
Dim length1 As Integer = Await download1
Dim length2 As Integer = Await download2
Dim length3 As Integer = Await download3
Dim total As Integer = length1 + length2 + length3
' Display the total count for all of the websites.
resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf &
"Total bytes returned: {0}" & vbCrLf, total)
End Function
Private Async Function ProcessURLAsync(url As String, client As HttpClient) As Task(Of Integer)
Dim byteArray = Await client.GetByteArrayAsync(url)
DisplayResults(url, byteArray)
Return byteArray.Length
End Function
Private Sub DisplayResults(url As String, content As Byte())
' Display the length of each website. The string format
' is designed to be used with a monospaced font, such as
' Lucida Console or Global Monospace.
Dim bytes = content.Length
' Strip off the "https://".
Dim displayURL = url.Replace("https://", "")
resultsTextBox.Text &= String.Format(vbCrLf & "{0,-58} {1,8}", displayURL, bytes)
End Sub
End Class