web-dev-qa-db-fra.com

Exécuter la tâche en arrière-plan dans l'application WPF

Exemple

private void Start(object sender, RoutedEventArgs e)
{
    int progress = 0;
    for (;;)
    {
        System.Threading.Thread.Sleep(1);
        progress++;
        Logger.Info(progress);
    }
}

Quelle est l'approche recommandée (TAP ou TPL ou BackgroundWorker ou Dispatcher ou autres) si je veux que Start()

  1. pas bloquer le thread d'interface utilisateur
  2. fournir des rapports d'étape
  3. être annulable
  4. prendre en charge le multithreading
14
Syaiful Nizam Yahya

Avec .NET 4.5 (ou .NET 4.0 + Microsoft.Bcl.Async ), la meilleure façon est d'utiliser l'API basée sur Task et async/await. Il permet d'utiliser le workflow de code séquentiel (pseudo-) pratique et d'avoir une gestion des exceptions structurée.

Exemple:

private async void Start(object sender, RoutedEventArgs e)
{
    try
    {
        await Task.Run(() =>
        {
            int progress = 0;
            for (; ; )
            {
                System.Threading.Thread.Sleep(1);
                progress++;
                Logger.Info(progress);
            }
        });
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Plus de lecture:

Comment exécuter une tâche en arrière-plan WPF tout en étant capable de fournir un rapport et d'autoriser l'annulation?

Async dans 4.5: Activation de la progression et de l'annulation dans les API Async.

Async et attente .

Async/Await FAQ .

24
noseratio

La meilleure façon de procéder consiste à utiliser un BackgroundWorker.

La raison pour laquelle je signale celui-ci est qu'il est spécialement conçu pour traiter le travail en arrière-plan tout en laissant le thread d'interface utilisateur disponible et réactif. Il a également intégré des notifications Progress et prend en charge Cancellation.

Je suggère de regarder quelques exemples d'un BackgroundWorker.

Maintenant, lorsque vous commencez à regarder le travail en arrière-plan, il y a un point Cancellation dans lequel vous devrez creuser plus profondément. La définition de la propriété d'annulation d'un travailleur en arrière-plan n'annule pas le travailleur en arrière-plan, cela déclenche simplement un indicateur pour que votre méthode en cours s'exécute à intervalles réguliers et arrête gracieusement le traitement.

Voici l'un de mes messages d'il y a un moment parlant de l'annulation d'un arrière-plan https://stackoverflow.com/a/20941072/1397504

Finalement. Asyncrone ne signifie pas multicœur ou même multithread. ( WIKI )

5
Nico

Vous pouvez exécuter une opération sur un thread distinct dans WPF à l'aide de la classe BackgroundWorker.

vérifiez cet exemple Comment utiliser WPF Background Worker

Et lisez la classe sur MSDN ici http://msdn.Microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

1
StackTrace