BackgroundWorker.DoWork Händelse
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Inträffar när RunWorkerAsync() anropas.
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
Händelsetyp
Exempel
I följande kodexempel visas hur händelsen används DoWork för att starta en asynkron åtgärd. Det här kodexemplet är en del av ett större exempel för BackgroundWorker klassen.
// 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.
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
Kommentarer
Den här händelsen utlöses när du anropar RunWorkerAsync metoden. Det är här du startar åtgärden som utför det potentiellt tidskrävande arbetet.
Koden i DoWork händelsehanteraren bör regelbundet kontrollera egenskapsvärdet CancellationPending och avbryta åtgärden om den är true. När detta inträffar kan du ange flaggan för till Cancel, och System.ComponentModel.DoWorkEventArgs flaggan true för i händelsehanteraren Cancelled anges till System.ComponentModel.RunWorkerCompletedEventArgs.RunWorkerCompletedtrue
Caution
Tänk på att koden i DoWork händelsehanteraren kan slutföra sitt arbete när en begäran om annullering görs, och din avsökningsloop kan missa CancellationPending att anges till true. I det här fallet Cancelled anges inte flaggan System.ComponentModel.RunWorkerCompletedEventArgs för i händelsehanteraren RunWorkerCompleted till , trots att trueen begäran om annullering gjordes. Den här situationen kallas för ett konkurrenstillstånd och är ett vanligt problem inom flertrådad programmering. Mer information om designproblem med flera trådar finns i Metodtips för hanterad trådning.
Om åtgärden ger ett resultat kan du tilldela resultatet till DoWorkEventArgs.Result egenskapen. Detta kommer att vara tillgängligt för RunWorkerCompleted händelsehanteraren i egenskapen RunWorkerCompletedEventArgs.Result .
Om åtgärden genererar ett undantag som koden inte hanterar, BackgroundWorker fångar undantaget och skickar det till RunWorkerCompleted händelsehanteraren, där det exponeras som Error egenskapen System.ComponentModel.RunWorkerCompletedEventArgsför . Om du kör under Visual Studio felsökaren bryts felsökaren vid den punkt i händelsehanteraren DoWork där det ohanterade undantaget uppstod. Om du har fler än en BackgroundWorkerbör du inte referera till någon av dem direkt, eftersom detta skulle koppla händelsehanteraren DoWork till en specifik instans av BackgroundWorker. I stället bör du komma åt din BackgroundWorker genom att casta parametern sender i händelsehanteraren DoWork .
Du måste vara noga med att inte ändra några användargränssnittsobjekt i händelsehanteraren DoWork . Kommunicera i stället med användargränssnittet via BackgroundWorker händelserna.
Mer information om hur du hanterar händelser finns i Hantera och höja händelser.