Gå til indholdet

O290 Async (cancellationtoken)

Prøv at skabe en konsol app med denne kode:

await LangProces();

async Task LangProces()
{
    Console.WriteLine("Timer startet og kan ikke afbrydes");
    await Task.Delay(10000); // Vent i 10 sekunder
    Console.WriteLine("Timer afsluttet");
}

Kør koden og læg mærke til at den kører i 10 sekunder og kan ikke afbrydes.

Din opgave er nu at ændre koden så den kan afbrydes. Brug en CancellationToken til at afbryde processen i LangProces.

For at lytte efter Esc-tasten kan du bruge denne kode:

// Lyt efter Esc-tast i en separat tråd
// Gem Task.Run-task i en _ (ignorer den) - mere for at undgå en warning

var _ = Task.Run(() =>
{
    while (true)
    {
        if (Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape)
        {
            // kode mangler...
        }
    }
});

Så lytter den efter Esc-tasten på en tråd for sig selv.

Klik for at se et forslag til en løsning
var cts = new CancellationTokenSource(); // Opret en CancellationTokenSource

// Lyt efter Esc-tast i en separat tråd
// Gem Task.Run-task i en _ (ignorer den) - mere for at undgå en warning
var _ = Task.Run(() =>
{
    while (true)
    {
        if (Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape)
        {
            Console.WriteLine("Esc trykket, afbryder processen...");
            cts.Cancel(); // Annullér processen, hvis Esc trykkes
            break;
        }
    }
});

await LangProces(cts.Token); // Kald LangProces med cancellation token

async Task LangProces(CancellationToken token)
{
    Console.WriteLine("Timer startet. Tryk Esc for at afbryde.");

    try
    {
        await Task.Delay(10000, token); // Vent i 10 sekunder eller indtil annullering
        Console.WriteLine("Timer afsluttet.");
    }
    catch (TaskCanceledException)
    {
        Console.WriteLine("Timer blev afbrudt.");
    }
}