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
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 Open de Gereedschapskist, klik op het tabblad Componenten en sleep de BackgroundWorker component naar uw formulier.
Het
backgroundWorker1
onderdeel wordt weergegeven in het onderdeelvak.Stel in het venster Eigenschappen de eigenschap WorkerSupportsCancellation in op
true
.Klik in het venster Eigenschappen op de knop Events en dubbelklik vervolgens op de DoWork en RunWorkerCompleted events om eventhandlers te maken.
Voeg uw tijdrovende code in de DoWork event handler in.
Extraheer alle parameters die vereist zijn voor de bewerking uit de eigenschap Argument van de parameter DoWorkEventArgs.
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
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
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
Dubbelklik in Windows Forms Designer op
startButton
om de Click gebeurtenis-handler te maken.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
Dubbelklik in Windows Forms Designer op
cancelButton
om de Click gebeurtenis-handler te maken.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
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
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.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
Implementeer een formulier dat de voortgang rapporteert als een asynchrone bewerking wordt uitgevoerd. Zie Procedure: Een formulier implementeren dat gebruikmaakt van een achtergrondbewerkingvoor meer informatie.
Implementeer een klasse die ondersteuning biedt voor het Asynchrone patroon voor onderdelen. Zie Het Asynchrone patroon op basis van gebeurtenissen implementerenvoor meer informatie.
Zie ook
.NET Desktop feedback