Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Istnieje wiele często wykonywanych operacji, które mogą zająć dużo czasu. Przykład:
Pobieranie obrazów
Wywołania usługi sieci Web
Pobieranie i wysyłanie plików (w tym dla aplikacji peer-to-peer)
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ć BackgroundWorker, wystarczy po prostu poinformować, jaką czasochłonną metodę roboczą wykonać w tle, a następnie wywołać metodę RunWorkerAsync. Wątek wywołujący nadal działa normalnie, podczas gdy metoda robocza jest uruchamiana asynchronicznie. Po zakończeniu metody BackgroundWorker alertuje wątek wywołujący, uruchamiając zdarzenie RunWorkerCompleted, 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 roboczej. Klasa BackgroundWorker uwidacznia DoWork zdarzenie, do którego jest dołączony wątek procesu roboczego za pośrednictwem programu obsługi zdarzeń DoWork .
Obsługa zdarzenia DoWork przyjmuje parametr DoWorkEventArgs, który ma właściwość Argument. 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 roboczej 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.
Ostrzeżenie
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 także
- Zarządzane wątkowanie
- Omówienie wzorca asynchronicznego opartego na zdarzeniach
- Instrukcje: implementowanie formularza korzystającego z operacji w tle
.NET Desktop feedback