Sdílet prostřednictvím


Přehled komponenty BackgroundWorker

Provádění mnoha běžně provedených operací může trvat dlouhou dobu. Například:

  • Stažení obrázků

  • Vyvolání webové služby

  • Soubory ke stažení a nahrávání (včetně aplikací peer-to-peer)

  • Komplexní místní výpočty

  • Databázové transakce

  • Přístup k místnímu disku vzhledem k jeho pomalé rychlosti vzhledem k přístupu k paměti

Operace podobné těmto operacím můžou způsobit, že se vaše uživatelské rozhraní během běhu zablokuje. Pokud chcete responzivní uživatelské rozhraní a dochází k dlouhým zpožděním spojeným s těmito operacemi, poskytuje komponenta BackgroundWorker pohodlné řešení.

Komponenta BackgroundWorker umožňuje asynchronně spouštět časově náročné operace (na pozadí) na vlákně, které se liší od hlavního vlákna uživatelského rozhraní vaší aplikace. Pokud chcete použít BackgroundWorker, jednoduše určíte, jakou časově náročnou pracovní metodu má provést na pozadí, a poté zavoláte metodu RunWorkerAsync. Volající vlákno funguje normálně, zatímco pracovní metoda běží asynchronně. Po dokončení metody BackgroundWorker upozorní volající vlákno aktivací události RunWorkerCompleted, která volitelně obsahuje výsledky operace.

Komponenta je k dispozici v nástrojové sadě, v záložce Součásti. Pokud chcete do svého formuláře přidat , přetáhněte komponentu na váš formulář. Zobrazí se v zásobníku komponent a jeho vlastnosti se zobrazí v okně Vlastnosti.

K zahájení asynchronní operace použijte metodu RunWorkerAsync. RunWorkerAsync přebírá volitelný parametr object, který lze použít k předání argumentů pracovní metodě. Třída BackgroundWorker zveřejňuje událost DoWork, ke které je pracovní vlákno připojeno prostřednictvím obslužné rutiny události DoWork.

Obslužná rutina události DoWork přebírá parametr DoWorkEventArgs, který má vlastnost Argument. Tato vlastnost přijímá parametr z RunWorkerAsync a lze jej předat vaší pracovní metodě, která bude volána v obslužné rutině události DoWork. Následující příklad ukazuje, jak přiřadit výsledek z pracovní metody nazvané ComputeFibonacci. Toto je součást většího příkladu, který můžete najít v Jak na to: Implementace formuláře, který používá operaci na pozadí.

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

Další informace o používání obslužných rutin událostí naleznete v tématu Události.

Opatrnost

Při použití multithreadingu jakéhokoli druhu se potenciálně vystavujete velmi vážným a složitým chybám. Před implementací jakéhokoli řešení, které používá vícevláknové zpracování, konzultujte osvědčené postupy pro spravované vláknování.

Další informace o použití třídy BackgroundWorker naleznete v tématu Postupy: Spuštění operace na pozadí.

Viz také