Cómo utilizar backgroundWorker para operaciones asincrónicas
Introducción a los componentes
La clase BackgroundWorker se encuentra en el espacio de nombres System.ComponentModel e implementa un modelo asincrónico basado en eventos realizando operaciones en subprocesos independientes. A continuación se presentan los principales miembros de la clase BackgroundWorker.
El primer método principal de la clase BackgroundWorker es RunWorkerAsync, que se utiliza para enviar una solicitud para comenzar a ejecutar una operación de forma asincrónica. Cuando se emite la solicitud, genera el evento DoWork para iniciar la ejecución asincrónica en el. controlador de eventos Código de operación. La firma del método RunWorkerAsync es la siguiente:
publicvoidRunWorkerAsync();
publicvoidRunWorkerAsync(Object argument);
Si la operación asincrónica requiere parámetros de operación, ellos Se puede utilizar como suministro de parámetros. Es posible que sea necesaria la conversión de objetos y tipos durante el acceso.
El método CancelAsync envía una solicitud para finalizar la operación asincrónica y establece la propiedad CancellationPending en verdadero. Tenga en cuenta que el éxito del método CancelAsync está relacionado con la propiedad WorkerSupportsCancellation, que debe establecerse en verdadero si se permite la cancelación de operaciones asincrónicas. Permite cancelar operaciones asíncronas estableciendo la propiedad WorkerSupportsCancellation en verdadero; de lo contrario, el método generará una excepción. El método CancelAsync no toma parámetros y su firma de método es la siguiente:
publicvoid CancelAsync();
Cuando se llama al método CancelAsync, se llamará a BitTorrent y se generará una excepción. . Cuando se llama al método CancelAsync, el valor de la propiedad CancellationPending de BackgroundWorker se establecerá en verdadero, por lo que al escribir un método auxiliar que se ejecuta en un hilo separado, el código debe verificar periódicamente si la propiedad CancellationPending está establecida en verdadero. Si es verdadero, la ejecución del método auxiliar debería finalizar. Una cosa a tener en cuenta es que es posible que el código en el controlador de eventos DoWork ya haya completado el procesamiento cuando se realiza la solicitud de cancelación, por lo que es posible que el controlador de eventos DoWork o el método auxiliar no establezcan la propiedad CancellationPending en verdadero. En este caso, incluso si se llama al método CancelAsync para emitir una solicitud para cancelar la operación asincrónica, el indicador Cancelado del parámetro RunWorkerCompletedEventArgs en el controlador de eventos RunWorkerCompleted no se establecerá en verdadero. Esto suele ser un problema de condición de carrera en multi-. programación con subprocesos, por lo que se debe tener en cuenta al escribir código.
Si necesita realizar un seguimiento del progreso de una operación asincrónica, la clase BackgroundWorker proporciona un método ReportProgress que genera el evento ProgressChanged y se registra con un controlador de eventos para recuperar información de progreso asincrónico. La firma de este método es la siguiente:
publicvoidReportProgress(int percentProgress);
publicvoidReportProgress(int percentProgress, Object userState);
Este método contiene dos versiones , donde percentProgress representa el porcentaje de progreso, el rango de valores es de 0 a 100 y userState es un parámetro opcional que representa un estado de usuario personalizado.
Al igual que el método CancelAsync, cuando la propiedad WorkerReportsProgress de BackgroundWorker se establece en verdadero, el método ReportProgress se llamará correctamente; de lo contrario, se generará una excepción InvalidOperationException.
Las tres propiedades de BackgroundWorker se mencionan anteriormente. CancellationPending se usa para indicar si la operación se ha cancelado. WorkerReportsProgress y WorkerSupportsCancellation se usan para establecer si se permiten operaciones de informe de progreso y cancelación, respectivamente.
publicboolCancellationPending { get; }
publicboolWorkerReportsProgress { get; set }
publicboolWorkerSupportsCancellation { get }
Otro será El la propiedad utilizada es IsBusy,
publicbool IsBusy { get }