WORDS
Task: ContinueWith
Givet en Task
kan man skicka in ett återanrop (callback), som exekveras när Task
en har fullföljts, antingen genom att resultatet satts, eller genom att exception har kastats.
Task<int> futureResult = Task.Run(() =>
{
// Gör en långsam beräkning i en annan tråd
return 2 + 2;
});
futureResult.ContinueWith(resultTask =>
{
if (resultTask.IsFaulted || resultTask.IsCanceled)
{
// Som `catch`.
Console.WriteLine($"Fel: {resultTask.Exception}");
}
else
{
Console.WriteLine($"Resultatet är {resultTask.Result}"); // Resultatet är 4
}
});
Allt detta exekveras asynkront, och det finns ingen garanti att återanropet till Run
körs i samma tråd som återanropet till ContinueWith
. Såhär hade man skrivit koden synkront.
try
{
var result = 2 + 2;
Console.WriteLine($"Resultatet är {result}"); // Resultatet är 4
}
catch (Exception e)
{
Console.WriteLine($"Fel: {e}");
}
Den synkrona varianten gör inte exakt samma sak som ContinueWith
-varianten, men man skulle troligtvis ha skrivit koden på det sättet. Tänk om det fanns ett sätt att med ett par nyckelord kunna skriva lika enkel kod, men med asynkroniciteten hos Task
...