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.");
}
}