Tengo un formulario de Windows (C# .NET) con una etiqueta de estado que parece que no puedo actualizar en el medio de un proceso en los métodos del controlador de eventos. Mi código es el siguiente ...Por qué no controlará la actualización/actualización a mitad del proceso
void Process_Completed(object sender, EventArgs e)
{
string t = "Process is finished!";
this.Invoke(new StatusLabelUpdator(updateStatusLabel), new object[] { t });
}
void Process_Started(object sender, EventArgs e)
{
string t = "Process has begun";
this.Invoke(new StatusLabelUpdator(updateStatusLabel), new object[] { t });
}
private delegate void StatusLabelUpdator(string text);
private void updateStatusLabel(string text)
{
StatusLabel1.Text = text;
statusStrip1.Invalidate();
statusStrip1.Refresh();
statusStrip1.Update();
}
Cuando ejecuto el código, una vez iniciado el proceso, se activa el método Process_Started, y un par de segundos más tarde se activa el método Process_Completed. Por algún motivo, no puedo conseguir que la etiqueta de estado muestre siempre "El proceso ha comenzado". ¡Solo muestra "El proceso ha terminado!". Como puede ver, he intentado invalidar, actualizar y actualizar la lista de estado que contiene la etiqueta de estado, pero no ha tenido éxito. No puedo llamar a update/refresh/invalidate en la etiqueta de estado porque esos métodos no están disponibles. ¿Qué estoy haciendo mal?
AÑADIDO INFORMACIÓN:
El "proceso" se inicia mediante un clic de botón en el formulario que llama a un método en una clase separada que tiene este aspecto:
public void DoSomeProcess()
{
TriggerProcessStarted();
System.Threading.Thread.Sleep(2000); // For testing..
TriggerProcessComplete();
}
y dentro de los métodos TriggerProcessxxxx I desencadenar los eventos utilizando este código ...
var EventListeners = EH.GetInvocationList(); //EH is the appropriate EventHandler
if (EventListeners != null)
{
for (int index = 0; index < EventListeners.Count(); index++)
{
var methodToInvoke = (EventHandler)EventListeners[index];
methodToInvoke.BeginInvoke(this, EventArgs.Empty, EndAsyncEvent, new object[] { });
}
}
Por último, he añadido Application.DoEvents()
al método updateStatusLabel
pero no sirvió de nada. Todavía estoy obteniendo el mismo resultado. Aquí está mi método de actualización.
private void updateStatusLabel(string text)
{
StatusLabel1.Text = text;
statusStrip1.Refresh();
Application.DoEvents();
}
así que supongo que el "proceso" está teniendo lugar en el hilo de interfaz de usuario, pero eventhandler se invoca en su propio hilo que invoca la actualización de control de vuelta en el hilo de interfaz de usuario. ¿Es esta una forma tonta de hacer las cosas? Nota: La clase que contiene el método DoSomeProcess() está en una .NET ClassLibrary separada a la que me refiero.
Intenté su "hack" pero no pareció ayudar. Agregué más detalles a la pregunta anterior ahora. – PICyourBrain
DESPUÉS DE EDITAR: Tiene razón. Dejé BeginInvoke solo, pero cambié el evento de clic de botón para iniciar DoSomeWork en su propio hilo. ¡Eso lo solucionó! – PICyourBrain
¡Genial, me alegro de que haya ayudado! –