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()
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:
Async dans 4.5: Activation de la progression et de l'annulation dans les API Async.
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 )
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