Delen via


Overzicht: Een bewerking uitvoeren op de achtergrond

Als het lang duurt voordat een bewerking is voltooid en u geen vertragingen wilt veroorzaken in uw gebruikersinterface, kunt u de BackgroundWorker-klasse gebruiken om de bewerking uit te voeren op een andere thread.

Zie Procedure: Een bewerking uitvoeren op de achtergrondvoor een volledige lijst van de code die in dit voorbeeld wordt gebruikt.

Een bewerking op de achtergrond uitvoeren

  1. Als uw formulier actief is in Windows Forms Designer in Visual Studio, sleept u twee Button besturingselementen uit de Werkset naar het formulier en stelt u de eigenschappen van de Name en Text van de knoppen in volgens de volgende tabel.

    Knop Naam Tekst
    button1 startBtn starten
    button2 cancelBtn annuleren
  2. Open de Gereedschapskist, klik op het tabblad Componenten en sleep de BackgroundWorker component naar uw formulier.

    Het backgroundWorker1 onderdeel wordt weergegeven in het onderdeelvak.

  3. Stel in het venster Eigenschappen de eigenschap WorkerSupportsCancellation in op true.

  4. Klik in het venster Eigenschappen op de knop Events en dubbelklik vervolgens op de DoWork en RunWorkerCompleted events om eventhandlers te maken.

  5. Voeg uw tijdrovende code in de DoWork event handler in.

  6. Extraheer alle parameters die vereist zijn voor de bewerking uit de eigenschap Argument van de parameter DoWorkEventArgs.

  7. Wijs het resultaat van de berekening toe aan de eigenschap Result van de DoWorkEventArgs.

    Dit zal beschikbaar zijn voor de RunWorkerCompleted gebeurtenis-afhandelaar.

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        // Do not access the form's BackgroundWorker reference directly.
        // Instead, use the reference provided by the sender parameter.
        BackgroundWorker bw = sender as BackgroundWorker;
    
        // Extract the argument.
        int arg = (int)e.Argument;
    
        // Start the time-consuming operation.
        e.Result = TimeConsumingOperation(bw, arg);
    
        // If the operation was canceled by the user,
        // set the DoWorkEventArgs.Cancel property to true.
        if (bw.CancellationPending)
        {
            e.Cancel = true;
        }
    }
    
    Private Sub backgroundWorker1_DoWork( _
    sender As Object, e As DoWorkEventArgs) _
    Handles backgroundWorker1.DoWork
    
       ' Do not access the form's BackgroundWorker reference directly.
       ' Instead, use the reference provided by the sender parameter.
       Dim bw As BackgroundWorker = CType( sender, BackgroundWorker )
       
       ' Extract the argument.
       Dim arg As Integer = Fix(e.Argument)
       
       ' Start the time-consuming operation.
       e.Result = TimeConsumingOperation(bw, arg)
       
       ' If the operation was canceled by the user, 
       ' set the DoWorkEventArgs.Cancel property to true.
       If bw.CancellationPending Then
          e.Cancel = True
       End If
    
    End Sub   
    
  8. Voeg code in voor het ophalen van het resultaat van de bewerking in de RunWorkerCompleted gebeurtenis-handler.

    // This event handler demonstrates how to interpret
    // the outcome of the asynchronous operation implemented
    // in the DoWork event handler.
    private void backgroundWorker1_RunWorkerCompleted(
        object sender,
        RunWorkerCompletedEventArgs e)
    {
        if (e.Cancelled)
        {
            // The user canceled the operation.
            MessageBox.Show("Operation was canceled");
        }
        else if (e.Error != null)
        {
            // There was an error during the operation.
            string msg = String.Format("An error occurred: {0}", e.Error.Message);
            MessageBox.Show(msg);
        }
        else
        {
            // The operation completed normally.
            string msg = String.Format("Result = {0}", e.Result);
            MessageBox.Show(msg);
        }
    }
    
    ' This event handler demonstrates how to interpret 
    ' the outcome of the asynchronous operation implemented
    ' in the DoWork event handler.
    Private Sub backgroundWorker1_RunWorkerCompleted( _
    sender As Object, e As RunWorkerCompletedEventArgs) _
    Handles backgroundWorker1.RunWorkerCompleted
    
       If e.Cancelled Then
          ' The user canceled the operation.
          MessageBox.Show("Operation was canceled")
       ElseIf (e.Error IsNot Nothing) Then
          ' There was an error during the operation.
          Dim msg As String = String.Format("An error occurred: {0}", e.Error.Message)
          MessageBox.Show(msg)
       Else
          ' The operation completed normally.
          Dim msg As String = String.Format("Result = {0}", e.Result)
          MessageBox.Show(msg)
       End If
    End Sub   
    
  9. Implementeer de methode TimeConsumingOperation.

    // This method models an operation that may take a long time
    // to run. It can be cancelled, it can raise an exception,
    // or it can exit normally and return a result. These outcomes
    // are chosen randomly.
    private int TimeConsumingOperation(
        BackgroundWorker bw,
        int sleepPeriod )
    {
        int result = 0;
    
        Random rand = new Random();
    
        while (!bw.CancellationPending)
        {
            bool exit = false;
    
            switch (rand.Next(3))
            {
                // Raise an exception.
                case 0:
                {
                    throw new Exception("An error condition occurred.");
                    break;
                }
    
                // Sleep for the number of milliseconds
                // specified by the sleepPeriod parameter.
                case 1:
                {
                    Thread.Sleep(sleepPeriod);
                    break;
                }
    
                // Exit and return normally.
                case 2:
                {
                    result = 23;
                    exit = true;
                    break;
                }
    
                default:
                {
                    break;
                }
            }
    
            if( exit )
            {
                break;
            }
        }
    
        return result;
    }
    
    ' This method models an operation that may take a long time 
    ' to run. It can be cancelled, it can raise an exception,
    ' or it can exit normally and return a result. These outcomes
    ' are chosen randomly.
    Private Function TimeConsumingOperation( _
    bw As BackgroundWorker, _
    sleepPeriod As Integer) As Integer
    
       Dim result As Integer = 0
       
       Dim rand As New Random()
       
         While Not bw.CancellationPending
             Dim [exit] As Boolean = False
    
             Select Case rand.Next(3)
                 ' Raise an exception.
                 Case 0
                     Throw New Exception("An error condition occurred.")
                     Exit While
    
                     ' Sleep for the number of milliseconds
                     ' specified by the sleepPeriod parameter.
                 Case 1
                     Thread.Sleep(sleepPeriod)
                     Exit While
    
                     ' Exit and return normally.
                 Case 2
                     result = 23
                     [exit] = True
                     Exit While
    
                 Case Else
                     Exit While
             End Select
    
             If [exit] Then
                 Exit While
             End If
         End While
       
       Return result
    End Function
    
  10. Dubbelklik in Windows Forms Designer op startButton om de Click gebeurtenis-handler te maken.

  11. Roep de methode RunWorkerAsync aan in de Click event-handler voor startButton.

    private void startBtn_Click(object sender, EventArgs e)
    {
        this.backgroundWorker1.RunWorkerAsync(2000);
    }
    
    Private Sub startButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles startBtn.Click
        Me.backgroundWorker1.RunWorkerAsync(2000)
    End Sub
    
  12. Dubbelklik in Windows Forms Designer op cancelButton om de Click gebeurtenis-handler te maken.

  13. Roep de methode CancelAsync aan in de Click event handler voor cancelButton.

    private void cancelBtn_Click(object sender, EventArgs e)
    {
        this.backgroundWorker1.CancelAsync();
    }
    
    Private Sub cancelButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cancelBtn.Click
        Me.backgroundWorker1.CancelAsync()
    End Sub
    
  14. Importeer boven aan het bestand de naamruimten System.ComponentModel en System.Threading.

    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Threading;
    using System.Windows.Forms;
    
    Imports System.ComponentModel
    Imports System.Drawing
    Imports System.Threading
    Imports System.Windows.Forms
    
  15. Druk op F6 om de oplossing te bouwen en druk vervolgens op Ctrl+F5- om de toepassing buiten het foutopsporingsprogramma uit te voeren.

    Notitie

    Als u op F5 drukt om de toepassing uit te voeren onder het foutopsporingsprogramma, wordt de uitzondering die in de methode TimeConsumingOperation wordt gegenereerd, gevangen en weergegeven door het foutopsporingsprogramma. Wanneer u de toepassing buiten het foutopsporingsprogramma uitvoert, verwerkt de BackgroundWorker de uitzondering en slaat deze in de cache op in de eigenschap Error van het RunWorkerCompletedEventArgs.

  16. Klik op de knop Start om een asynchrone bewerking uit te voeren en klik vervolgens op de knop Annuleren om een actieve asynchrone bewerking te stoppen.

    Het resultaat van elke bewerking wordt weergegeven in een MessageBox.

Volgende stappen

Zie ook