Estoy jugando con operaciones asincrónicas y mi objetivo en este momento es muy simple. Solo quiero actualizar un campo de texto al comienzo de un cálculo grande, y el problema al que me enfrento es que el campo de texto se actualiza pero solo cuando calculate() regresa, aunque el método computingMessage() es llamado inmediatamente:

private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
    e.Handled = true;           
    annunciate();                
    calculate();
}

private void annunciate(){
    Thread updateUI = new Thread( new ThreadStart( computingMessage ));
    updateUI.Start();             
}

private void computingMessage(){
    txtVerification.Dispatcher.Invoke((Action)(
        () => txtVerification.Text = "Calculating..."
    ));                
}
-2
E-Bat 17 feb. 2015 a las 00:03

2 respuestas

La mejor respuesta

Aunque estoy de acuerdo con @dbvega en espíritu. No estoy de acuerdo con el uso de Task.Factory.StartNew. Tampoco debe usar Dispatcher.Invoke. De forma predeterminada, Task.Factory.CurrentScheduler se establecerá en el programador de bombeo de mensajes de WPF al ejecutar WPF. Al ejecutar WinForms, hay un programador de WinForm que se configura automáticamente ...

private async void Button_Click(object sender, RoutedEventArgs e)
{
    TextBoxOutput.Text = "calculating...";

    var result = await Task.Run(Calculate);
    TextBoxOutput.Text = result.ToString(CultureInfo.InvariantCulture);
}

private int Calculate()
{
   Thread.Sleep(2000); //--similate working....
   return Environment.TickCount ^ 43;
}
1
Aron 17 feb. 2015 a las 03:09