C# async
Exemple 1 - Méthode asynchrone simple
public static async Task run1()
{
Console.WriteLine("Début");
await AttenteAsync();
Console.WriteLine("Fin");
}
public static async Task AttenteAsync()
{
await Task.Delay(2000); // Attend 2 secondes de manière asynchrone
Console.WriteLine("Attente terminée");
}
Exemple 2 - Méthode asynchrone avec retour
public static async Task run2()
{
var ret = CalculerAsync(5);
var resultat = await CalculerAsync(5);
Console.WriteLine($"Résultat : {resultat}");
}
static async Task CalculerAsync(int x)
{
await Task.Delay(10000); // simulation calcul long
return x * x;
}
Exemple 3 - Appels parallèles
public static async Task run3()
{
var t1 = OperationAsync("A", 20000);
var t2 = OperationAsync("B", 10000);
await Task.WhenAll(t1, t2); // attend que toutes les tâches soient terminées
Console.WriteLine("Toutes les opérations terminées !");
return "ok tout est terminé";
}
static async Task OperationAsync(string nom, int delai)
{
Console.WriteLine($"Opération {nom} démarrée");
await Task.Delay(delai);
Console.WriteLine($"Opération {nom} terminée");
}
Avec une liste
public async Task<int> CalculerAsync(int n)
{
for (int i = 0; i < n; i++)
await Task.Delay(1000); // simulation d'opération longue
Console.WriteLine($"task end {n}");
return n*10;
}
public async Task ExempleParallel()
{
var tasks = new List<Task<int>>();
for (int i = 0; i < 10; i++)
{
tasks.Add(CalculerAsync(i%5+1));
}
int[] results = await Task.WhenAll(tasks);
foreach (int result in results)
{
Console.WriteLine($"Result: {result}");
}
Console.WriteLine("Toutes les tâches terminées");
}
public async Task Run()
{
await ExempleParallel();
}
With timeout
public async Task<int> CalculerAsync(int n)
{
for (int i = 0; i < n; i++)
await Task.Delay(1000); // simulation d'opération longue
Console.WriteLine($"task end {n}");
return n * 10;
}
public async Task<T> WithTimeout<T>(Task<T> task, int timeoutMs)
{
var timeout = Task.Delay(timeoutMs);
var finish = await Task.WhenAny(task, timeout);
if (finish == timeout)
{
Console.WriteLine("Timed out");
}
return await task; // retourne le résultat original
}
public async Task Run()
{
Task<int> t = CalculerAsync(1);
int value = await WithTimeout(t, 500);
}
Timeout with cancel
public async Task<int> CalculerAsync(int n, CancellationToken token)
{
for (int i = 0; i < n; i++)
{
token.ThrowIfCancellationRequested(); // vérifie l'annulation
await Task.Delay(1000); // simulation d'opération longue
}
Console.WriteLine($"task end {n}");
return n * 10;
}
public async Task<T> AvecTimeout<T>(Func<CancellationToken, Task<T>> action, int timeoutMs)
{
using var cts = new CancellationTokenSource();
var task = action(cts.Token); // task qui supporte l'annulation
var timeout = Task.Delay(timeoutMs, cts.Token);
var finished = await Task.WhenAny(task, timeout);
if (finished == timeout)
{
cts.Cancel(); // demande d'annulation
Console.WriteLine("C A N C E L");
}
return await task;
}
public async Task Run()
{
try
{
var result = await AvecTimeout(async token =>
{
return await CalculerAsync(10, token); // méthode annulable
}, 20000);
Console.WriteLine($"Resultat {result}");
}
catch (TimeoutException)
{
Console.WriteLine("TimeoutException");
}
catch (OperationCanceledException)
{
Console.WriteLine("OperationCanceledException");
}
}
Task in background
public void RunInBackground()
{
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
Console.WriteLine("Tâche en background");
}
});
}
var p = new MainTuto();
p.RunInBackground();
for (int i = 0; i < 100; i++)
{
Console.WriteLine($"Main {i}");
Task.Delay(100).Wait(); // bloque
}
task in background with cancel
public void RunInBackground()
{
// If already running, ignore or stop first
if (_backgroundTask is { IsCompleted: false }) return;
_cts = new CancellationTokenSource();
var token = _cts.Token;
// Start the background task
_backgroundTask = Task.Run(async () =>
{
try
{
for (int i = 0; i < 10; i++)
{
// Non-blocking delay that supports cancellation
await Task.Delay(1000, token);
Console.WriteLine("Tâche en background");
}
}
catch (OperationCanceledException)
{
Console.WriteLine("Background task: cancelled.");
throw;
}
catch (Exception ex)
{
Console.WriteLine($"Background task error: {ex}");
}
}, token);
}
public async Task StopAsync()
{
if (_cts is null) return;
try
{
_cts.Cancel();
if (_backgroundTask != null)
await _backgroundTask;
}
catch (OperationCanceledException)
{
Console.WriteLine("C A N C E L");
}
finally
{
_cts.Dispose();
_cts = null;
_backgroundTask = null;
Console.WriteLine("C A N C E L");
}
}