Programmation Asynchrone .NET C#

Fonctionnement Asynchrone

Introduit dans le Framework 4

async & await

<code>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private async void buttonDownload_Click(object sender, RoutedEventArgs e)
{
var client = new WebClient();
var result = await client.DownloadStringTaskAsync(new Uri(textboxURL.Text));
textboxResult.Text = result;
}
}
</code>

Le mot clé async indique que la méthode est asynchrone. Cela permet d'identifier les méthodes qui pourraient être longues en termes d'exécution et donc qu'il serait préférable d'utiliser de manière asynchrone.

L'utilisation du mot clé async dans une méthode suppose que le mot clé await est utilisé au moins une fois dans son implémentation (si ce n'était pas le cas, vous obtiendriez un Warning). Ce mot clé est appliqué sur une tâche (Task ou Task<TResult>) et permet de suspendre l'exécution d'une méthode asynchrone jusqu'à la fin de l'exécution de cette tâche.

La méthode marquée comme asynchrone va donc s'exécuter de manière synchrone au départ. Ce n'est que quand la méthode voudra exécuter une ligne avec une tâche évaluée par await que l'exécution sera suspendue pour lancer une exécution asynchrone de la tâche. Ainsi, le thread principal de l'interface récupère la main pendant cette exécution asynchrone. Une fois que cette tâche est terminée, l'exécution revient sur la ligne marquée await afin de récupérer le résultat de l'opération asynchrone. L'exécution synchrone de la méthode reprend ensuite son cours.

Le mot clé async peut aussi être utilisé avec les [[knowdb:dev:dotnet:anonymous-methods|Méthodes anonymes]] ...
<code>
private async void buttonDownload_Click(object sender, RoutedEventArgs e)
{
var client = new WebClient();

Func<Task> delegateToDownloadAsString = async delegate()
{
var result = await client.DownloadStringTaskAsync(new Uri(textboxURL.Text));
textboxResult.Text = result;
};
await delegateToDownloadAsString();
}
</code>

et les [[knowdb:dev:dotnet:lambda-expressions|Expressions lambda]] :
<code>
private async void buttonDownload_Click(object sender, RoutedEventArgs e)
{
var client = new WebClient();

Func<Task> lambdaToDownloadAsString = async () =>
{
var result = await client.DownloadStringTaskAsync(new Uri(textboxURL.Text));
textboxResult.Text = result;
};

await lambdaToDownloadAsString();

}
</code>

IAsyncEnumerator<T> Interface


https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.iasyncenumerator-1?view=net-8.0

Commentaires

Posts les plus consultés de ce blog

Sécurité des Applications

Principes de la Programmation Orientée Objet

Principe de Responsabilité Unique