Sdílet prostřednictvím


BackgroundWorker.DoWork Událost

Definice

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 truea 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 truehodnotu , 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í.

Platí pro

Viz také