Panoramica del componente BackgroundWorker
Esistono molte operazioni eseguite comunemente che possono richiedere molto tempo per l'esecuzione. Per esempio:
Download di immagini
Chiamate al servizio Web
Download e caricamenti di file (inclusi per le applicazioni peer-to-peer)
Calcoli locali complessi
Transazioni di database
Accesso al disco locale, data la velocità lenta rispetto all'accesso alla memoria
Le operazioni come queste possono causare il blocco dell'interfaccia utente durante l'esecuzione. Quando si vuole un'interfaccia utente reattiva e si riscontrano lunghi ritardi associati a tali operazioni, il componente BackgroundWorker offre una soluzione pratica.
Il componente BackgroundWorker consente di eseguire operazioni che richiedono molto tempo in modo asincrono ("in background"), in un thread diverso dal thread principale dell'applicazione. Per usare un BackgroundWorker, è sufficiente indicare quale metodo di lavoro richiede tempo per l'esecuzione in background e quindi chiamare il metodo RunWorkerAsync. Il thread chiamante continua a funzionare normalmente mentre il metodo di lavoro viene eseguito in modo asincrono. Al termine del metodo, il BackgroundWorker avvisa il thread chiamante attivando l'evento RunWorkerCompleted, che contiene facoltativamente i risultati dell'operazione.
Il componente BackgroundWorker è disponibile nella casella degli strumenti , nella scheda componenti. Per aggiungere un BackgroundWorker al modulo, trascina il componente BackgroundWorker nel modulo. Viene visualizzato nella barra dei componenti e le relative proprietà vengono visualizzate nella finestra Proprietà.
Per avviare l'operazione asincrona, usare il metodo RunWorkerAsync.
RunWorkerAsync accetta un parametro object
facoltativo, che può essere usato per passare argomenti al metodo del lavoratore. La classe BackgroundWorker espone l'evento DoWork a cui è collegato il thread di lavoro tramite un gestore eventi DoWork.
Il gestore eventi DoWork accetta un parametro DoWorkEventArgs, che ha una proprietà Argument. Questa proprietà riceve il parametro da RunWorkerAsync e può essere passato al tuo metodo worker, che verrà chiamato dal gestore dell’evento DoWork. Nell'esempio seguente viene illustrato come assegnare un risultato da un metodo di lavoro denominato ComputeFibonacci
. Fa parte di un esempio più ampio, disponibile in Come implementare un modulo che usa un'operazione in background.
// 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
Per altre informazioni sull'uso dei gestori eventi, vedere Events.
Attenzione
Quando si usa il multithreading di qualsiasi tipo, è possibile esporre se stessi a bug molto gravi e complessi. Consultare Migliori pratiche per il threading gestito prima di implementare qualsiasi soluzione che utilizza il multithreading.
Per altre informazioni sull'uso della classe BackgroundWorker, vedere Procedura: Eseguire un'operazione in background.
Feedback su .NET Desktop feedback
.NET Desktop feedback è un progetto di open source. Selezionare un collegamento per fornire feedback: