A BackgroundWorker összetevő áttekintése

Számos gyakran végrehajtott művelet végrehajtása hosszú időt vehet igénybe. Például:

  • Képletöltések

  • Webszolgáltatás-meghívások

  • Fájlletöltések és feltöltések (beleértve a társközi alkalmazásokat is)

  • Összetett helyi számítások

  • Adatbázis-tranzakciók

  • Helyi lemezhozzáférés, mivel lassú a memóriahozzáféréshez képest

Az ilyen műveletek futás közben blokkolhatják a felhasználói felületet. Ha rugalmas felhasználói felületet szeretne, és az ilyen műveletekhez kapcsolódó hosszú késésekkel szembesül, a BackgroundWorker összetevő kényelmes megoldást kínál.

A BackgroundWorker összetevő lehetővé teszi az időigényes műveletek aszinkron (a háttérben) végrehajtását az alkalmazás fő felhasználói felületi szálától eltérő szálon. A BackgroundWorkerhasználatához egyszerűen meg kell adnia, hogy milyen időigényes munkavégző metódust kell végrehajtania a háttérben, majd meghívja a RunWorkerAsync metódust. A hívószál továbbra is a szokásos módon fut, miközben a feldolgozó metódus aszinkron módon fut. Ha a metódus befejeződött, a BackgroundWorker riasztást küld a hívó szálról a RunWorkerCompleted esemény aktiválásával, amely opcionálisan tartalmazza a művelet eredményeit.

A BackgroundWorker összetevő az EszközkészletÖsszetevők lapján érhető el. Ha BackgroundWorker szeretne hozzáadni az űrlaphoz, húzza a BackgroundWorker összetevőt az űrlapra. Az összetevő tálcán jelenik meg, tulajdonságai pedig a Tulajdonságok ablakban jelennek meg.

Az aszinkron művelet elindításához használja a RunWorkerAsync metódust. RunWorkerAsync egy választható object paramétert használ, amellyel argumentumokat adhat át a feldolgozó metódusnak. A BackgroundWorker osztály elérhetővé teszi az DoWork eseményt, amelyhez a feldolgozószál egy DoWork eseménykezelőn keresztül csatlakozik.

Az DoWork eseménykezelő egy DoWorkEventArgs paramétert vesz fel, amely Argument tulajdonságú. Ez a tulajdonság megkapja a paramétert a RunWorkerAsync-tól, és át lehet adni az Ön dolgozó metódusának, amelyet az eseménykezelő az DoWork-ben fog meghívni. Az alábbi példa bemutatja, hogyan rendelhet eredményhez egy ComputeFibonaccinevű feldolgozói metódust. Ez egy átfogóbb példa része, amelyet megtalálhat a Útmutató: Háttérműveletet használó űrlap implementálása-nél.

// 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

További információ az eseménykezelők használatáról: Események.

Figyelmeztetés

Bármilyen többszálú használat esetén nagyon komoly és összetett hibáknak teheti ki magát. A többszálas megoldás implementálása előtt tekintse meg a felügyelt szálkezelés ajánlott eljárásait.

További információ a BackgroundWorker osztály használatáról: Művelet futtatása a háttérben.

Lásd még