Megosztás a következőn keresztül:


Aszinkron tevékenység vagy tevékenységek listájának lemondása (Visual Basic)

Beállíthat egy gombot, amellyel megszakíthatja az aszinkron alkalmazásokat, ha nem szeretné megvárni, amíg befejeződik. A jelen témakör példáit követve hozzáadhat egy lemondási gombot egy alkalmazáshoz, amely letölti egy webhely tartalmát vagy egy webhelylistát.

A példák az Async-alkalmazás (Visual Basic) finomhangolását ismertető felhasználói felületet használják.

Feljegyzés

A példák futtatásához telepítve kell lennie a Visual Studio 2012-nek vagy újabbnak, valamint a .NET-keretrendszer 4.5-ös vagy újabb verziójának.

Tevékenység megszakítása

Az első példa egyetlen letöltési feladattal társítja a Mégse gombot. Ha a gombot választja, miközben az alkalmazás tartalmat tölt le, a letöltés megszakad.

A példa letöltése

Töltse le a teljes Windows megjelenítési alaprendszer (WPF) projektet az Async-mintából: Az alkalmazás finomhangolása, majd kövesse az alábbi lépéseket.

  1. Bontsa ki a letöltött fájlt, majd indítsa el a Visual Studiót.

  2. A menüsávon válassza a Fájl, Megnyitás, Projekt/Megoldás lehetőséget.

  3. A Projekt megnyitása párbeszédpanelen nyissa meg a kibontott mintakódot tartalmazó mappát, majd nyissa meg az AsyncFineTuningVB megoldásfájlját (.sln).

  4. A Megoldáskezelő nyissa meg a CancelATask projekt helyi menüjét, majd válassza a Beállítás kezdőprojektként lehetőséget.

  5. A projekt futtatásához válassza az F5 billentyűt.

    A Ctrl+F5 billentyűkombinációval hibakeresés nélkül futtathatja a projektet.

Ha nem szeretné letölteni a projektet, a témakör végén áttekintheti a MainWindow.xaml.vb fájlokat.

A példa létrehozása

Az alábbi módosítások hozzáadnak egy Mégse gombot egy webhelyet letöltő alkalmazáshoz. Ha nem szeretné letölteni vagy felépíteni a példát, a témakör végén található "Példák kitöltése" szakaszban áttekintheti a végterméket. Csillag jelöli a kód módosításait.

A példa elkészítéséhez lépésről lépésre kövesse a "Példa letöltése" szakaszban található utasításokat, de a CancelATask helyett válassza a StarterCode-ot startUp projektként.

Ezután adja hozzá a következő módosításokat a projekt MainWindow.xaml.vb fájljába.

  1. Deklaráljon egy változót CancellationTokenSource , ctsamely a hozzá hozzáférő összes metódus hatókörébe tartozik.

    Class MainWindow
    
        ' ***Declare a System.Threading.CancellationTokenSource.
        Dim cts As CancellationTokenSource
    
  2. Adja hozzá az alábbi eseménykezelőt a Mégse gombra. Az eseménykezelő a CancellationTokenSource.Cancel metódus használatával értesíti cts , ha a felhasználó lemondást kér.

    ' ***Add an event handler for the Cancel button.
    Private Sub cancelButton_Click(sender As Object, e As RoutedEventArgs)
    
        If cts IsNot Nothing Then
            cts.Cancel()
        End If
    End Sub
    
  3. Végezze el az alábbi módosításokat a Start gomb eseménykezelőjében. startButton_Click

    • A , ctspéldányosításaCancellationTokenSource.

      ' ***Instantiate the CancellationTokenSource.
      cts = New CancellationTokenSource()
      
    • A hívásban AccessTheWebAsync, amely letölti egy adott webhely tartalmát, küldje el argumentumként a CancellationTokenSource.Token tulajdonságot cts . A Token tulajdonság a lemondás kérése esetén propagálja az üzenetet. Adjon hozzá egy fogási blokkot, amely üzenetet jelenít meg, ha a felhasználó úgy dönt, hogy megszakítja a letöltési műveletet. Az alábbi kód a módosításokat mutatja.

      Try
          ' ***Send a token to carry the message if cancellation is requested.
          Dim contentLength As Integer = Await AccessTheWebAsync(cts.Token)
      
          resultsTextBox.Text &=
              vbCrLf & $"Length of the downloaded string: {contentLength}." & vbCrLf
      
          ' *** If cancellation is requested, an OperationCanceledException results.
      Catch ex As OperationCanceledException
          resultsTextBox.Text &= vbCrLf & "Download canceled." & vbCrLf
      
      Catch ex As Exception
          resultsTextBox.Text &= vbCrLf & "Download failed." & vbCrLf
      End Try
      
  4. Ebben AccessTheWebAsyncaz esetben használja a HttpClient.GetAsync(String, CancellationToken) metódus túlterhelését GetAsync a HttpClient webhely tartalmának letöltéséhez. Adja meg cta CancellationToken paramétert AccessTheWebAsynca második argumentumként. A jogkivonat akkor hordozza az üzenetet, ha a felhasználó a Mégse gombot választja.

    Az alábbi kód a módosításokat mutatja be a következőben AccessTheWebAsync: .

    ' ***Provide a parameter for the CancellationToken.
    Async Function AccessTheWebAsync(ct As CancellationToken) As Task(Of Integer)
    
        Dim client As HttpClient = New HttpClient()
    
        resultsTextBox.Text &= vbCrLf & "Ready to download." & vbCrLf
    
        ' You might need to slow things down to have a chance to cancel.
        Await Task.Delay(250)
    
        ' GetAsync returns a Task(Of HttpResponseMessage).
        ' ***The ct argument carries the message if the Cancel button is chosen.
        Dim response As HttpResponseMessage = Await client.GetAsync("https://msdn.microsoft.com/library/dd470362.aspx", ct)
    
        ' Retrieve the website contents from the HttpResponseMessage.
        Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync()
    
        ' The result of the method is the length of the downloaded website.
        Return urlContents.Length
    End Function
    
  5. Ha nem mondja le a programot, a következő kimenetet hozza létre:

    Ready to download.
    Length of the downloaded string: 158125.
    

    Ha a Mégse gombot választja, mielőtt a program befejezi a tartalom letöltését, a program a következő kimenetet hozza létre:

    Ready to download.
    Download canceled.
    

Tevékenységek listájának visszavonása

Az előző példát kiterjesztheti több tevékenység megszakítására is, ha ugyanazt CancellationTokenSource a példányt társítja az egyes tevékenységekhez. Ha a Mégse gombot választja, megszakítja az összes még nem befejezett feladatot.

A példa letöltése

Töltse le a teljes Windows megjelenítési alaprendszer (WPF) projektet az Async-mintából: Az alkalmazás finomhangolása, majd kövesse az alábbi lépéseket.

  1. Bontsa ki a letöltött fájlt, majd indítsa el a Visual Studiót.

  2. A menüsávon válassza a Fájl, Megnyitás, Projekt/Megoldás lehetőséget.

  3. A Projekt megnyitása párbeszédpanelen nyissa meg a kibontott mintakódot tartalmazó mappát, majd nyissa meg az AsyncFineTuningVB megoldásfájlját (.sln).

  4. A Megoldáskezelő nyissa meg a CancelAListOfTasks projekt helyi menüjét, majd válassza a Beállítás kezdőprojektként lehetőséget.

  5. A projekt futtatásához válassza az F5 billentyűt.

    A Ctrl+F5 billentyűkombinációval hibakeresés nélkül futtathatja a projektet.

Ha nem szeretné letölteni a projektet, a témakör végén áttekintheti a MainWindow.xaml.vb fájlokat.

A példa létrehozása

A példa kibővítéséhez lépésről lépésre kövesse a "Példa letöltése" szakasz utasításait, de startUp projektként válassza a CancelATask lehetőséget. Adja hozzá a következő módosításokat a projekthez. Csillag jelöli a program változásait.

  1. Adjon hozzá egy metódust a webcímek listájának létrehozásához.

    ' ***Add a method that creates a list of web addresses.
    Private Function SetUpURLList() As List(Of String)
    
        Dim urls = New List(Of String) From
            {
                "https://msdn.microsoft.com",
                "https://msdn.microsoft.com/library/hh290138.aspx",
                "https://msdn.microsoft.com/library/hh290140.aspx",
                "https://msdn.microsoft.com/library/dd470362.aspx",
                "https://msdn.microsoft.com/library/aa578028.aspx",
                "https://msdn.microsoft.com/library/ms404677.aspx",
                "https://msdn.microsoft.com/library/ff730837.aspx"
            }
        Return urls
    End Function
    
  2. Hívja meg a metódust a következőben AccessTheWebAsync: .

    ' ***Call SetUpURLList to make a list of web addresses.
    Dim urlList As List(Of String) = SetUpURLList()
    
  3. Adja hozzá a következő ciklust AccessTheWebAsync a lista egyes webcímeinek feldolgozásához.

    ' ***Add a loop to process the list of web addresses.
    For Each url In urlList
        ' GetAsync returns a Task(Of HttpResponseMessage).
        ' Argument ct carries the message if the Cancel button is chosen.
        ' ***Note that the Cancel button can cancel all remaining downloads.
        Dim response As HttpResponseMessage = Await client.GetAsync(url, ct)
    
        ' Retrieve the website contents from the HttpResponseMessage.
        Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync()
    
        resultsTextBox.Text &=
            vbCrLf & $"Length of the downloaded string: {urlContents.Length}." & vbCrLf
    Next
    
  4. Mivel AccessTheWebAsync megjeleníti a hosszokat, a metódusnak nem kell semmit visszaadnia. Távolítsa el a visszatérési utasítást, és módosítsa a metódus visszatérési típusát ahelyettTask<TResult>, hogy Task az .

    Async Function AccessTheWebAsync(ct As CancellationToken) As Task
    

    A metódus startButton_Click meghívása kifejezés helyett utasítással.

    Await AccessTheWebAsync(cts.Token)
    
  5. Ha nem mondja le a programot, a következő kimenetet hozza létre:

    Length of the downloaded string: 35939.
    
    Length of the downloaded string: 237682.
    
    Length of the downloaded string: 128607.
    
    Length of the downloaded string: 158124.
    
    Length of the downloaded string: 204890.
    
    Length of the downloaded string: 175488.
    
    Length of the downloaded string: 145790.
    
    Downloads complete.
    

    Ha a Letöltések befejezése előtt a Mégse gombot választja, a kimenet a lemondás előtt befejezett letöltések hosszát tartalmazza.

    Length of the downloaded string: 35939.
    
    Length of the downloaded string: 237682.
    
    Length of the downloaded string: 128607.
    
    Downloads canceled.
    

Példák kitöltése

A következő szakaszok az előző példák kódját tartalmazzák. Figyelje meg, hogy hozzá kell adnia egy hivatkozást a következőhöz System.Net.Http: .

A projektek az Async-mintából tölthetők le: Az alkalmazás finomhangolása.

Példa tevékenység megszakítása

Az alábbi kód az egyetlen feladatot megszakító példa teljes MainWindow.xaml.vb fájlja.

' Add an Imports directive and a reference for System.Net.Http.
Imports System.Net.Http

' Add the following Imports directive for System.Threading.
Imports System.Threading

Class MainWindow

    ' ***Declare a System.Threading.CancellationTokenSource.
    Dim cts As CancellationTokenSource

    Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs)
        ' ***Instantiate the CancellationTokenSource.
        cts = New CancellationTokenSource()

        resultsTextBox.Clear()

        Try
            ' ***Send a token to carry the message if cancellation is requested.
            Dim contentLength As Integer = Await AccessTheWebAsync(cts.Token)

            resultsTextBox.Text &=
                vbCrLf & $"Length of the downloaded string: {contentLength}." & vbCrLf

            ' *** If cancellation is requested, an OperationCanceledException results.
        Catch ex As OperationCanceledException
            resultsTextBox.Text &= vbCrLf & "Download canceled." & vbCrLf

        Catch ex As Exception
            resultsTextBox.Text &= vbCrLf & "Download failed." & vbCrLf
        End Try

        ' ***Set the CancellationTokenSource to Nothing when the download is complete.
        cts = Nothing
    End Sub

    ' ***Add an event handler for the Cancel button.
    Private Sub cancelButton_Click(sender As Object, e As RoutedEventArgs)

        If cts IsNot Nothing Then
            cts.Cancel()
        End If
    End Sub

    ' ***Provide a parameter for the CancellationToken.
    Async Function AccessTheWebAsync(ct As CancellationToken) As Task(Of Integer)

        Dim client As HttpClient = New HttpClient()

        resultsTextBox.Text &=
            vbCrLf & "Ready to download." & vbCrLf

        ' You might need to slow things down to have a chance to cancel.
        Await Task.Delay(250)

        ' GetAsync returns a Task(Of HttpResponseMessage).
        ' ***The ct argument carries the message if the Cancel button is chosen.
        Dim response As HttpResponseMessage = Await client.GetAsync("https://msdn.microsoft.com/library/dd470362.aspx", ct)

        ' Retrieve the website contents from the HttpResponseMessage.
        Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync()

        ' The result of the method is the length of the downloaded website.
        Return urlContents.Length
    End Function
End Class

' Output for a successful download:

' Ready to download.

' Length of the downloaded string: 158125.

' Or, if you cancel:

' Ready to download.

' Download canceled.

Példa tevékenységek listájának megszakítása

A következő kód a feladatlistát megszakító példa teljes MainWindow.xaml.vb fájlja.

' Add an Imports directive and a reference for System.Net.Http.
Imports System.Net.Http

' Add the following Imports directive for System.Threading.
Imports System.Threading

Class MainWindow

    ' Declare a System.Threading.CancellationTokenSource.
    Dim cts As CancellationTokenSource

    Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs)

        ' Instantiate the CancellationTokenSource.
        cts = New CancellationTokenSource()

        resultsTextBox.Clear()

        Try
            ' ***AccessTheWebAsync returns a Task, not a Task(Of Integer).
            Await AccessTheWebAsync(cts.Token)
            '  ***Small change in the display lines.
            resultsTextBox.Text &= vbCrLf & "Downloads complete."

        Catch ex As OperationCanceledException
            resultsTextBox.Text &= vbCrLf & "Downloads canceled." & vbCrLf

        Catch ex As Exception
            resultsTextBox.Text &= vbCrLf & "Downloads failed." & vbCrLf
        End Try

        ' Set the CancellationTokenSource to Nothing when the download is complete.
        cts = Nothing
    End Sub

    ' Add an event handler for the Cancel button.
    Private Sub cancelButton_Click(sender As Object, e As RoutedEventArgs)

        If cts IsNot Nothing Then
            cts.Cancel()
        End If
    End Sub

    ' Provide a parameter for the CancellationToken.
    ' ***Change the return type to Task because the method has no return statement.
    Async Function AccessTheWebAsync(ct As CancellationToken) As Task

        Dim client As HttpClient = New HttpClient()

        ' ***Call SetUpURLList to make a list of web addresses.
        Dim urlList As List(Of String) = SetUpURLList()

        ' ***Add a loop to process the list of web addresses.
        For Each url In urlList
            ' GetAsync returns a Task(Of HttpResponseMessage).
            ' Argument ct carries the message if the Cancel button is chosen.
            ' ***Note that the Cancel button can cancel all remaining downloads.
            Dim response As HttpResponseMessage = Await client.GetAsync(url, ct)

            ' Retrieve the website contents from the HttpResponseMessage.
            Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync()

            resultsTextBox.Text &=
                vbCrLf & $"Length of the downloaded string: {urlContents.Length}." & vbCrLf
        Next
    End Function

    ' ***Add a method that creates a list of web addresses.
    Private Function SetUpURLList() As List(Of String)

        Dim urls = New List(Of String) From
            {
                "https://msdn.microsoft.com",
                "https://msdn.microsoft.com/library/hh290138.aspx",
                "https://msdn.microsoft.com/library/hh290140.aspx",
                "https://msdn.microsoft.com/library/dd470362.aspx",
                "https://msdn.microsoft.com/library/aa578028.aspx",
                "https://msdn.microsoft.com/library/ms404677.aspx",
                "https://msdn.microsoft.com/library/ff730837.aspx"
            }
        Return urls
    End Function

End Class

' Output if you do not choose to cancel:

' Length of the downloaded string: 35939.

' Length of the downloaded string: 237682.

' Length of the downloaded string: 128607.

' Length of the downloaded string: 158124.

' Length of the downloaded string: 204890.

' Length of the downloaded string: 175488.

' Length of the downloaded string: 145790.

' Downloads complete.

'  Sample output if you choose to cancel:

' Length of the downloaded string: 35939.

' Length of the downloaded string: 237682.

' Length of the downloaded string: 128607.

' Downloads canceled.

Lásd még