Como han dicho otros, el problema es que está bloqueando el hilo de la interfaz de usuario.
En lugar de utilizar las sugerencias con Application.DoEvents
, le sugiero que utilice un DispatcherTimer
para programar la actualización. Código de ejemplo:
DispatcherTimer timer = new DispatcherTimer();
timer.Tick += delegate
{
label.Content = counter.ToString();
counter++;
if (counter == 500)
{
timer.Stop();
}
};
timer.Interval = TimeSpan.FromMilliseconds(2000);
timer.Start();
(no estoy seguro de si Application.DoEvents
funciona incluso en WPF, y está generalmente considerado como una mala práctica de todos modos Si hace trabajo, dudo que se garantiza que funcione en versiones futuras.. la mezcla de los dos interfaces de usuario en la misma aplicación por el simple hecho de que esto suena como una muy mala idea.)
usted podría utilizar unTimer
(ya sea System.Threading.Timer
o System.Timers.Timer
), pero en ambos casos, a continuación, se necesitaría volver a la cadena de distribución de todos modos. DispatcherTimer
lo hace más simple: el evento Tick
siempre se activa dentro del subproceso Dispatcher
de todos modos.
EDIT: Si realmente desea un equivalente de DoEvents
, aquí hay código que He verificado funciona, y se basa en la MSDN docs for Dispatcher.PushFrame
que explica cómo hacer el equivalente del Application.DoEvents
sino de WPF:
public void DoEvents()
{
DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
new DispatcherOperationCallback(ExitFrames), frame);
Dispatcher.PushFrame(frame);
}
public object ExitFrames(object f)
{
((DispatcherFrame)f).Continue = false;
return null;
}
private void ButtonClick(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 500; i++)
{
label.Content = i.ToString();
DoEvents();
}
}
Aún así, no lo recomendaría: WPF (como Windows Forms) está diseñado según un modo de trabajo orientado a eventos.
@drorhan: Claro, debido al temporizador. Eso se ajusta fácilmente. Escogí el momento debido a lo que estaba en la pregunta, sin duda, comentado. Ajustarlo a (digamos) un intervalo de 20 ms lo hará contar bastante rápido. –
@drorhan: (Ahora has editado el comentario) Esto tarda aproximadamente 500 x 2 s (1000 segundos, justo por debajo de los 17 minutos) para terminar. Eso refleja lo que dijo el OP sobre retrasar en 2 segundos. –
@drorhan: ¿Por qué no sería? Son 2000 ms (2 segundos) y se detiene después de 500 iteraciones. No me sorprendería ver que sea un poco más largo en realidad, pero debería ser * más o menos * correcto. –