Red de conocimiento de abogados - Derecho de sociedades - Cómo utilizar backgroundWorker para operaciones asincrónicas

Cómo utilizar backgroundWorker para operaciones asincrónicas

En las aplicaciones, es posible que encuentre algunas operaciones funcionales que consumen mucho tiempo, como descargas de datos, cálculos complejos y transacciones de bases de datos. Generalmente, dichas funciones se implementarán en subprocesos separados. Después de la ejecución, se mostrarán los resultados. en la interfaz de usuario, evitando así que la interfaz de usuario deje de responder durante mucho tiempo. En .NET 2.0 y versiones posteriores, FCL proporciona el componente BackgroundWorker para implementar fácilmente estos requisitos funcionales.

Introducción del componente

La clase BackgroundWorker se encuentra en el espacio de nombres System.ComponentModel. Esta clase realiza operaciones en un hilo separado para implementar el modo asincrónico basado en eventos. A continuación se presentan los principales miembros de la clase BackgroundWorker.

El primer método principal de la clase BackgroundWorker es RunWorkerAsync. Este método envía una solicitud para iniciar la operación en ejecución de forma asíncrona. Después de emitir la solicitud, se activará el evento DoWork y el código de operación asincrónica comenzará a funcionar. ser ejecutado en el controlador de eventos. 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, pueden ser proporcionado como parámetros de argumento, dado que el tipo de parámetro es Objeto, es posible que se requiera una conversión de tipo al acceder.

El método CancelAsync envía una solicitud para finalizar la operación asincrónica y establece la propiedad CancellationPending en verdadero. Cabe señalar que la llamada exitosa del método CancelAsync está relacionada con el atributo WorkerSupportsCancellation. Si se permite cancelar la operación asincrónica, el atributo WorkerSupportsCancellation debe establecerse en verdadero; de lo contrario, llamar a este método generará una excepción. El método CancelAsync no contiene parámetros y la firma del método es la siguiente:

publicvoid CancelAsync();

Cuando se llama al método CancelAsync, el valor de la propiedad CancellationPending de BackgroundWorker será debe establecerse en verdadero, por lo que al escribir un hilo separado Cuando se ejecuta el método auxiliar en el código, la propiedad CancellationPending debe verificarse periódicamente en el código para ver si la propiedad se ha establecido en verdadero. Si es verdadero, la ejecución de. El método auxiliar debe finalizar. Una cosa a tener en cuenta es que el código en el controlador de eventos DoWork puede haber completado el procesamiento cuando se emite la solicitud de cancelación. Por lo tanto, el controlador de eventos DoWork o el método auxiliar pueden perder la oportunidad de establecer 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. Este es un problema de condición de carrera que ocurre a menudo en. programación multiproceso, por lo que debe pensar en ello al escribir código.

Al realizar una operación asincrónica, si necesita realizar un seguimiento del progreso de la ejecución de la operación asincrónica, la clase BackgroundWorker proporciona el método ReportProgress. Llamar a este método activará el evento ProgressChanged. Obtenga la información del progreso de la ejecución asincrónica en el controlador de eventos.

La firma del método es la siguiente:

publicvoidReportProgress(int percentProgress);

publicvoidReportProgress(int percentProgress,Object userState);

Este método contiene dos versiones, percentProgress representa el porcentaje de progreso, el valor es 0-100, userState es un parámetro opcional que indica el estado del usuario personalizado.

Igual que el método CancelAsync, el método ReportProgress se llamará correctamente solo cuando la propiedad WorkerReportsProgress de BackgroundWorker esté establecida en verdadero; de lo contrario, se generará una excepción InvalidOperationException.

Las tres propiedades de BackgroundWorker se mencionaron anteriormente. CancellationPending se usa para preguntar si la operación se ha cancelado. WorkerReportsProgress y WorkerSupportsCancellation se usan para establecer si se permiten las operaciones de informe de progreso y cancelación, respectivamente.

publicboolCancellationPending { get; }

publicboolWorkerReportsProgress { get; set }

publicboolWorkerSupportsCancellation { get }

Otro lo hará; La propiedad utilizada es IsBusy,

publicbool IsBusy { get; }

Use esta propiedad para consultar si la instancia de BackgroundWorker está ejecutando una operación asincrónica. es verdad. De lo contrario, es falso.

La clase BackgroundWorker contiene 3 eventos. En el controlador de eventos, se pueden realizar operaciones asincrónicas para ayudar en la escritura de código e interactuar con la información de la interfaz de usuario.

publiceventDoWorkEventHandler DoWork;

publiceventProgressChangedEventHandler ProgressChanged;

publiceventRunWorkerCompletedEventHandler RunWorkerCompleted;

El controlador de eventos DoWork se utiliza para llamar a métodos auxiliares para el procesamiento real operaciones, dado que el controlador de eventos se ejecuta en un subproceso diferente de la interfaz de usuario, debe asegurarse de que no se manipulen objetos de la interfaz de usuario en el controlador de eventos DoWork. Si el método auxiliar requiere soporte de parámetros, se puede pasar a través del método RunWorkerAsync. En el controlador de eventos DoWork, el parámetro se puede extraer a través de la propiedad DoWorkEventArgs.Argument. Durante una operación asincrónica, puede obtener la información del progreso de la operación asincrónica a través del controlador de eventos ProgressChanged y obtener la información del resultado de la operación asincrónica a través del controlador de eventos RunWorkerCompleted. Puede comunicarse de forma segura con la interfaz de usuario en los controladores de eventos ProgressChanged y RunWorkerCompleted.