Udostępnij za pośrednictwem


BackgroundWorker — Informacje o składniku

Istnieje wiele często wykonywanych operacji, które mogą zająć dużo czasu. Przykład:

  • Pobieranie obrazów

  • Wywołania usługi sieci Web

  • Pliki do pobrania i przekazania (w tym dla aplikacji równorzędnych)

  • Złożone obliczenia lokalne

  • Transakcje bazy danych

  • Dostęp do dysku lokalnego, biorąc pod uwagę niską szybkość dostępu do pamięci

Takie operacje mogą spowodować zablokowanie interfejsu użytkownika podczas ich działania. Jeśli potrzebujesz dynamicznego interfejsu użytkownika i masz do czynienia z długimi opóźnieniami związanymi z takimi operacjami, BackgroundWorker składnik zapewnia wygodne rozwiązanie.

Składnik BackgroundWorker umożliwia asynchroniczne wykonywanie operacji czasochłonnych ("w tle") w wątku innym niż główny wątek interfejsu użytkownika aplikacji. Aby użyć BackgroundWorkerklasy , wystarczy po prostu poinformować ją, jaką czasochłonną metodę procesu roboczego wykonać w tle, a następnie wywołać metodę RunWorkerAsync . Wątek wywołujący nadal działa normalnie, podczas gdy metoda procesu roboczego jest uruchamiana asynchronicznie. Po zakończeniu metody alertuje BackgroundWorker wątek wywołujący, uruchamiając RunWorkerCompleted zdarzenie, które opcjonalnie zawiera wyniki operacji.

Składnik BackgroundWorker jest dostępny z przybornika na karcie Składniki . Aby dodać element BackgroundWorker do formularza, przeciągnij BackgroundWorker składnik do formularza. Zostanie on wyświetlony na pasku składników, a jego właściwości pojawią się w oknie Właściwości .

Aby rozpocząć operację asynchroniczną, użyj RunWorkerAsync metody . RunWorkerAsync przyjmuje opcjonalny object parametr, który może służyć do przekazywania argumentów do metody procesu roboczego. Klasa BackgroundWorker uwidacznia DoWork zdarzenie, do którego jest dołączony wątek procesu roboczego za pośrednictwem programu obsługi zdarzeń DoWork .

Procedura DoWork obsługi zdarzeń przyjmuje DoWorkEventArgs parametr, który ma Argument właściwość . Ta właściwość odbiera parametr z RunWorkerAsync metody i może zostać przekazana do metody procesu roboczego, która zostanie wywołana w procedurze obsługi zdarzeń DoWork . W poniższym przykładzie pokazano, jak przypisać wynik z metody procesu roboczego o nazwie ComputeFibonacci. Jest to część większego przykładu, który można znaleźć w artykule Instrukcje: implementowanie formularza korzystającego z operacji w tle.

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

Aby uzyskać więcej informacji na temat korzystania z programów obsługi zdarzeń, zobacz Zdarzenia.

Uwaga

W przypadku korzystania z wielowątku dowolnego rodzaju potencjalnie narażasz się na bardzo poważne i złożone błędy. Przed zaimplementowaniem dowolnego rozwiązania korzystającego z wielowątku zapoznaj się z najlepszymi rozwiązaniami dotyczącymi wątków zarządzanych.

Aby uzyskać więcej informacji na temat korzystania z BackgroundWorker klasy, zobacz Instrukcje: uruchamianie operacji w tle.

Zobacz też