Comment faire pour exécuter et d'interagir avec un async Tâche à partir d'une interface graphique WPF

J'ai un WPF GUI, où je veux appuyer sur un bouton pour démarrer une tâche de longue haleine sans gel de la fenêtre pour la durée de la tâche. Alors que la tâche est en cours, je voudrais obtenir des rapports sur les progrès, et j'aimerais intégrer un autre bouton qui permet d'arrêter la tâche à tout moment que je choisis.

Je ne peux pas la figure de la bonne façon d'utiliser les async/await/tâche. Je ne peux pas inclure tout ce que j'ai essayé, mais c'est ce que j'ai en ce moment.

Une fenêtre WPF classe :

public partial class MainWindow : Window
{
    readonly otherClass _burnBabyBurn = new OtherClass();
    internal bool StopWorking = false;

    //A button method to start the long running method
    private async void Button_Click_3(object sender, RoutedEventArgs e)
    {   
        Task burnTheBaby = _burnBabyBurn.ExecuteLongProcedureAsync(this, intParam1, intParam2, intParam3);

        await burnTheBaby;
    }

    //A button Method to interrupt and stop the long running method
    private void StopButton_Click(object sender, RoutedEventArgs e)
    {
        StopWorking = true;
    }

    //A method to allow the worker method to call back and update the gui
    internal void UpdateWindow(string message)
    {
        TextBox1.Text = message;
    }
}

Et une classe pour le travailleur méthode:

class OtherClass
{
    internal Task ExecuteLongProcedureAsync(MainWindow gui, int param1, int param2, int param3)
    {       
        var tcs = new TaskCompletionSource<int>();       

        //Start doing work
        gui.UpdateWindow("Work Started");        

        While(stillWorking)
        {
        //Mid procedure progress report
        gui.UpdateWindow("Bath water n% thrown out");        
        if (gui.StopTraining) return tcs.Task;
        }

        //Exit message
        gui.UpdateWindow("Done and Done");       
        return tcs.Task;        
    }
}

Cela fonctionne, mais le WPF fenêtre de fonction est toujours bloqué une fois que le travailleur méthode commence.

J'ai besoin de savoir comment organiser la async/await/tâche déclarations pour permettre

A) le travailleur méthode pour ne pas bloquer l'interface
B) laisser les travailleurs de la méthode de mise à jour de l'interface
C) permettre à l'interface pour arrêter l'interrompre et arrêter le travailleur méthode

De l'aide ou des pointeurs sont très appréciées.

OriginalL'auteur Kickaha | 2014-11-23