BackgroundWorker.DoWork Událost
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Vyvolá se při RunWorkerAsync() zavolání.
public:
event System::ComponentModel::DoWorkEventHandler ^ DoWork;
public event System.ComponentModel.DoWorkEventHandler DoWork;
public event System.ComponentModel.DoWorkEventHandler? DoWork;
member this.DoWork : System.ComponentModel.DoWorkEventHandler
Public Custom Event DoWork As DoWorkEventHandler
Event Type
Příklady
Následující příklad kódu ukazuje použití DoWork události ke spuštění asynchronní operace. Tento příklad kódu je součástí většího příkladu BackgroundWorker pro třídu.
// 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
Poznámky
Tato událost je vyvolána při volání RunWorkerAsync metody. Tady spustíte operaci, která provádí potenciálně časově náročnou práci.
Kód v obslužné rutině DoWork události by měl pravidelně kontrolovat CancellationPending hodnotu vlastnosti a přerušit operaci, pokud je true
. Když k tomu dojde, můžete nastavit Cancel příznak System.ComponentModel.DoWorkEventArgs na true
a Cancelled příznak System.ComponentModel.RunWorkerCompletedEventArgsRunWorkerCompleted v obslužné rutině události se nastaví na true
.
Upozornění
Mějte na paměti, že váš kód v DoWork obslužné rutině události může dokončit svou práci při vytváření žádosti o zrušení a že smyčka dotazování nemusí být CancellationPending nastavená na true
. V tomto případě Cancelled se příznak System.ComponentModel.RunWorkerCompletedEventArgsRunWorkerCompleted v obslužné rutině události nenastaví na true
hodnotu , i když byl proveden požadavek na zrušení. Tato situace se nazývá konflikt časování a je běžným problémem při programování s více vlákny. Další informace o problémech s návrhem multithreadingu najdete v tématu Osvědčené postupy pro spravovaná vlákna.
Pokud vaše operace vytvoří výsledek, můžete výsledek přiřadit vlastnosti DoWorkEventArgs.Result . To bude k dispozici obslužné rutině RunWorkerCompleted události ve RunWorkerCompletedEventArgs.Result vlastnosti.
Pokud operace vyvolá výjimku, kterou váš kód nezpracovává, BackgroundWorker výjimka se zachytí a předá ji do RunWorkerCompleted obslužné rutiny události, kde je vystavena jako Error vlastnost .System.ComponentModel.RunWorkerCompletedEventArgs Pokud spouštíte v ladicím programu sady Visual Studio, ladicí program se přeruší v bodě v DoWork obslužné rutině události, kde byla vyvolána neošetřená výjimka. Pokud máte více než jednu BackgroundWorker, neměli byste na žádnou z nich přímo odkazovat, protože by to sloučí DoWork obslužnou rutinu události s konkrétní instancí .BackgroundWorker Místo toho byste k sadě měli přistupovat BackgroundWorker přetypováním parametru sender
v obslužné rutině DoWork události.
Musíte být opatrní, abyste v DoWork obslužné rutině události nezmanipuloval s žádnými objekty uživatelského rozhraní. Místo toho komunikujte s uživatelským rozhraním BackgroundWorker prostřednictvím událostí.
Další informace o zpracování událostí najdete v tématu Zpracování a vyvolávání událostí.