visual resultado opciones information example critical con c# multithreading user-interface marshalling

resultado - show dialog c#



¿MessageBox.Show() se dirige automáticamente al subproceso UI? (4)

Lanzo un hilo a través de ThreadPool.QueueUserWorkItem que tiene un cuadro de diálogo de diálogo en él:

System.Windows.Forms.DialogResult dr = System.Windows.Forms.MessageBox.Show ("¿Desea descargar la actualización en segundo plano? ..", "Actualizar disponible", MessageBoxButtons.YesNo);

Parece funcionar bien, sin embargo, estoy un poco sospechoso después de que algunos clientes sugirieron que no estaban recibiendo el mensaje apareciendo. Tenía la sensación en .NET framework 2.0+ de que no necesita ordenar esta llamada en particular, sino que lo hace por usted. ¿Correcto?

Este es un tema semi relacionado que interesa: ¿Por qué usar una ventana de propietario en MessageBox.Show?


¿Es esto una aplicación o un servicio? Si se trata de un servicio, tal vez no esté configurado con el permiso ''Permitir la interacción con el escritorio''.

Vea las propiedades del servicio en el applet del panel de control de servicios.


Bueno, ordenaría y especificaría una ventana, solo para que el MessageBox pueda obtener el enfoque correcto. Puede ser que simplemente no puedan verlo porque está detrás de una de sus formas, y no saben que debería estar en primer plano.


Como regla general, no debe hacer el trabajo de la GUI fuera del hilo principal / aplicación. Haría un método ShowMessageBox en el formulario principal que puede hacer una Invocación:

public DialogResult ShowMessageBox (String message, String caption) { if (this.InvokeRequired) { return (DialogResult) this.Invoke (new PassStringStringReturnDialogResultDelegate (ShowMessageBox), message, caption); } return MessageBox.Show (this, message, caption); } public delegate DialogResult PassStringStringReturnDialogResultDelegate (String s1, String s2);

PERO TAMBIÉN TENGA EN CUENTA: al depurar una aplicación de interfaz gráfica de usuario multiproceso, y está depurando un hilo que no sea el principal / aplicación, NECESITA APAGAR la opción "Habilitar evaluación de propiedades y otras llamadas a funciones implícitas", o de lo contrario, VS obtendrá automáticamente los valores de los objetos de GUI locales / globales DESDE EL HILO ACTUAL, lo que hará que su aplicación falle o falle de forma extraña. Vaya a Herramientas-> Opciones-> Depuración para desactivar esa configuración.

Perdón por las tapas, pero esto me llevó DÍAS averiguar por qué cada vez que probé la depuración de mi aplicación se bloqueaba y luego se bloqueaba.


No, no es Mariscal del hilo de UI. Si lo piensas, no sería posible que lo haga.

Es posible tener más de un subproceso de interfaz de usuario en una aplicación. Algunos programas, como Internet Explorer, tienen muchos subprocesos de interfaz de usuario. ¿Qué subproceso de interfaz de usuario sería la opción de selección de .Show?

También es posible usar MessageBox.Show en una aplicación que no tiene subprocesos de interfaz de usuario. Puede llamar esto en una aplicación de consola y funcionará.

MessageBox.Show mostrará UI en el hilo desde el que se llama. Si todavía no hay una bomba de mensajes ejecutándose en el hilo, configurará una bomba temporal para funcionar. Lo derribará después de que se complete la llamada a la Show.