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
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é
- spravovaných vláken
- Přehled asynchronního vzoru založeného na událostech
- Postupy: Implementace formuláře, který používá operaci na pozadí
.NET Desktop feedback