visual vista ventana studio parcial pagina net mvc mostrar modal formulario bootstrap aspx asp c# wpf dialog backgroundworker

c# - vista - ventana modal en visual studio



Mostrando la ventana modal mientras BackgroundWorker se ejecuta, sin problema de STA/MTA (1)

No puede llamar a ShowDialog desde BackgroundWorker. Debe usar Dispatcher para solicitar el hilo de la interfaz de usuario para ejecutarlo:

this.Dispatcher.BeginInvoke(new Action(() => ProgressDialog.ShowDialog()));

El evento ''Completed'' del BackgroundWorker se ejecuta en el subproceso UI, por lo que esta parte debe estar bien.

Estoy trabajando en una aplicación WPF. Tengo un método lento que quiero ejecutar de forma sincronizada a través de BackgroundWorker . Mientras se ejecuta el método, quiero mostrar una ventana de diálogo modal "Espere ...", que se debe cerrar automáticamente cuando se complete BackgroundWorker .

Actualmente tengo muy poca experiencia con BackgroundWorker o con cualquier programa multiproceso.

El código siguiente da como resultado InvalidOperationException , con el mensaje "El hilo que llama debe ser STA, porque muchos componentes de la interfaz de usuario requieren esto".

Por favor, avíseme sobre cómo lograr lo que estoy tratando de lograr, y puntos adicionales de brownie si puede ayudarme a entender qué está pasando mal.

¡Muchas gracias!

EDITAR Solo para aclarar: la idea es que el hilo principal inicie BackgroundWorker y luego muestre el cuadro de diálogo modal. Cuando el trabajador completa, cierra el cuadro de diálogo modal. Cuando se cierra el cuadro de diálogo modal, el hilo principal continúa.

public class ImageResizer { private BackgroundWorker worker; private MemoryStream ImageData { get; set; } // incoming data private public MemoryStream ResizedImageData { get; private set; } // resulting data private Dialogs.WorkInProgressDialog ProgressDialog; // Public interface, called by using class: public MemoryStream ReduceImageSize(MemoryStream imageData) { // injected data: this.ImageData = imageData; // init progress dialog window: ProgressDialog = new Dialogs.WorkInProgressDialog(); // Start background worker that asyncronously does work worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); worker.RunWorkerAsync(); // Show progress dialog. Dialog is MODAL, and must only be closed when resizing is complete ProgressDialog.ShowDialog(); // THIS LINE CAUSES THE INVALID OPERATION EXCEPTION // This thread will only continue when ProgressDialog is closed. // Return result return ResizedImageData; } private void worker_DoWork(object sender, DoWorkEventArgs e) { // Call time consuming method ResizedImageData = ReduceImageSize_ActualWork(); } // The actual work method, called by worker_DoWork private MemoryStream ReduceImageSize_ActualWork() { // Lots of code that resizes this.ImageData and assigns it to this.ResizedImageData } private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { // Async work completed - close progress dialog ProgressDialog.Close(); } }