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


Aszinkron tevékenységek megszakítása egy adott időszak után (Visual Basic)

Ha nem szeretné megvárni a művelet befejezését, a metódussal CancellationTokenSource.CancelAfter megszakíthat egy aszinkron műveletet egy idő után. Ez a módszer ütemezi a kifejezés által meghatározott időtartamon belül nem befejezett társított tevékenységek törlését CancelAfter .

Ez a példa hozzáadja a Mégse aszinkron feladat vagy a Feladatok listája (Visual Basic) szolgáltatásban kifejlesztett kódot a webhelyek listájának letöltéséhez és az egyes feladatok tartalmának megjelenítéséhez.

Feljegyzés

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

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 CancelAfterTime 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.

  6. Futtassa többször a programot annak ellenőrzéséhez, hogy a kimenet minden webhely, webhely vagy webhely kimenetét megjeleníti-e.

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

A példa létrehozása

A jelen témakörben szereplő példa hozzáadja a Mégse aszinkron tevékenység vagy a Tevékenységek listája (Visual Basic) programban kifejlesztett projekthez a tevékenységek listájának törléséhez. A példa ugyanazt a felhasználói felületet használja, bár a Mégse gombot nem használja explicit módon.

Ha saját maga szeretné létrehozni a példát, kövesse a "Példa letöltése" szakaszban található utasításokat, de startUp projektként válassza a CancelAListOfTasks lehetőséget. Adja hozzá a jelen témakör módosításait a projekthez.

Ha meg szeretné adni a tevékenységek megszakításként való megjelölésének maximális idejét, adjon hozzá egy hívást CancelAfterstartButton_Clicka következő példához. Az összeadás csillaggal van megjelölve.

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

    ' Instantiate the CancellationTokenSource.
    cts = New CancellationTokenSource()

    resultsTextBox.Clear()

    Try
        ' ***Set up the CancellationTokenSource to cancel after 2.5 seconds. (You
        ' can adjust the time.)
        cts.CancelAfter(2500)

        Await AccessTheWebAsync(cts.Token)
        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

Futtassa többször a programot annak ellenőrzéséhez, hogy a kimenet minden webhely, webhely vagy webhely kimenetét megjeleníti-e. A következő kimenet egy minta:

Length of the downloaded string: 35990.

Length of the downloaded string: 407399.

Length of the downloaded string: 226091.

Downloads canceled.

Példa kitöltése

Az alábbi kód a példához tartozó MainWindow.xaml.vb fájl teljes szövege. Csillag jelöli a példához hozzáadott elemeket.

Figyelje meg, hogy hozzá kell adnia egy hivatkozást a következőhöz System.Net.Http: .

A projektet az Async-mintából töltheti le: Az alkalmazás finomhangolása.

' 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
            ' ***Set up the CancellationTokenSource to cancel after 2.5 seconds. (You
            ' can adjust the time.)
            cts.CancelAfter(2500)

            Await AccessTheWebAsync(cts.Token)
            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

    ' You can still include a Cancel button if you want to.
    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()

        ' Process each element in 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

' Sample output:

' Length of the downloaded string: 35990.

' Length of the downloaded string: 407399.

' Length of the downloaded string: 226091.

' Downloads canceled.

Lásd még