Dela via


Översikt över BackgroundWorker-komponent

Det finns många vanliga operationer som kan ta lång tid att utföra. Till exempel:

  • Bildnedladdningar

  • Webbtjänstanrop

  • Filnedladdningar och uppladdningar (inklusive för peer-to-peer-program)

  • Komplexa lokala beräkningar

  • Databastransaktioner

  • Lokal diskåtkomst, med tanke på dess långsamma hastighet i förhållande till minnesåtkomst

Åtgärder som dessa kan göra att användargränssnittet blockeras under tiden de körs. När du vill ha ett dynamiskt användargränssnitt och du stöter på långa fördröjningar som är associerade med sådana åtgärder är BackgroundWorker-komponenten en bekväm lösning.

Med komponenten BackgroundWorker kan du köra tidskrävande åtgärder asynkront ("i bakgrunden") på en tråd som skiljer sig från programmets huvudtråd för användargränssnittet. Om du vill använda en BackgroundWorkeranger du bara vilken tidskrävande arbetsmetod som ska köras i bakgrunden och sedan anropar du metoden RunWorkerAsync. Samtalstråden fortsätter att köras normalt medan arbetsmetoden körs asynkront. När metoden är klar aviserar BackgroundWorker den anropande tråden genom att starta händelsen RunWorkerCompleted, som eventuellt innehåller resultatet av åtgärden.

Komponenten BackgroundWorker är tillgänglig från Toolboxpå fliken Komponenter. Om du vill lägga till en BackgroundWorker i formuläret drar du BackgroundWorker komponenten till formuläret. Den visas i komponentfältet och dess egenskaper visas i fönstret Egenskaper.

Starta din asynkrona åtgärd genom att använda metoden RunWorkerAsync. RunWorkerAsync tar en valfri object parameter, som kan användas för att skicka argument till din arbetsmetod. Klassen BackgroundWorker exponerar händelsen DoWork som arbetstråden är kopplad till via en DoWork händelsehanterare.

Händelsehanteraren för DoWork tar en DoWorkEventArgs-parameter som har en Argument-egenskap. Den här egenskapen tar emot parametern från RunWorkerAsync och kan skickas till din arbetsmetod, som anropas i DoWork händelsehanterare. I följande exempel visas hur du tilldelar ett resultat från en arbetsmetod som heter ComputeFibonacci. Det är en del av ett större exempel som du hittar på Så här: Implementera ett formulär som använder en bakgrundsåtgärd.

// This event handler is where the actual,
// potentially time-consuming work is done.
void backgroundWorker1_DoWork( Object^ sender, DoWorkEventArgs^ e )
{
   // Get the BackgroundWorker that raised this event.
   BackgroundWorker^ worker = dynamic_cast<BackgroundWorker^>(sender);

   // Assign the result of the computation
   // to the Result property of the DoWorkEventArgs
   // object. This is will be available to the 
   // RunWorkerCompleted eventhandler.
   e->Result = ComputeFibonacci( safe_cast<Int32>(e->Argument), worker, e );
}
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(object sender,
    DoWorkEventArgs e)
{
    // Get the BackgroundWorker that raised this event.
    BackgroundWorker worker = sender as BackgroundWorker;

    // Assign the result of the computation
    // to the Result property of the DoWorkEventArgs
    // object. This is will be available to the
    // RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci((int)e.Argument, worker, e);
}
' This event handler is where the actual work is done.
Private Sub backgroundWorker1_DoWork( _
ByVal sender As Object, _
ByVal e As DoWorkEventArgs) _
Handles backgroundWorker1.DoWork

    ' Get the BackgroundWorker object that raised this event.
    Dim worker As BackgroundWorker = _
        CType(sender, BackgroundWorker)

    ' Assign the result of the computation
    ' to the Result property of the DoWorkEventArgs
    ' object. This is will be available to the 
    ' RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci(e.Argument, worker, e)
End Sub

Mer information om hur du använder händelsehanterare finns i Händelser.

Försiktighet

När du använder multitrådning av något slag kan du utsätta dig för mycket allvarliga och komplexa buggar. Läs bästa praxis för hanterad trådning innan du implementerar en lösning som använder multitrådning.

Mer information om hur du använder klassen BackgroundWorker finns i How to: Run an Operation in the Background.

Se även