Task
, async
och await
i C#: Introduktion
2019-04-05
I C# finns olika sätt att hantera concurrency, samtidig exekvering. Jag förespråkar Tasks, vilket är ämnet för den här artikelserien. Vi går igenom hur Tasks fungerar och några metoder som man kan använda med dom, och hur syntaxen för async/await ofta underlättar användandet av Tasks.Task: Run och FromResult
2019-04-06
Utför en uppgift Om man vill exekvera en uppgift i en egen tråd, men inte vill administrera trådpooler eller manuellt hålla koll på om uppgiften har utförts, så kan man använda Task.Run. Den resulterande Task som skapas innehåller information om huruvida den har kastat exception, avslutats korrekt eller avbrutits.Task: ContinueWith
2019-04-07
Givet en Task kan man skicka in ett återanrop (callback), som exekveras när Tasken 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.
Snyggare syntax med async
/await
2019-04-12
async och await ger snyggare syntax när man arbetar med Tasks i C#. Låt oss börja med en synkron beräkning. När man anropar den, så kommer den aktuella tråden att blockeras tills beräkningen är klar, vilket kan ta lång tid om det är en långsam beräkning.Task: Delay
2019-04-13
Oftast vill man att ens kod ska köra så snabbt som möjligt, men ibland behöver man lägga in en fördröjning. Istället för Thread.Sleep kan man skapa en task som avslutas efter det angivna antalet millisekunder med Task.Delay. private async Task<int> CalculateDelay() { // Vänta i 3 sek await Task.Task: Result
2019-04-14
Om en metod returnerar en Task så är det ofta en bra idé att fortsätta använda Tasks och async/await i sin egen kod. Det gör det mer uppenbart för dom som använder ens metod att operationen kan ta lång tid. Ibland måste man emellertid implementera ett synkront interface, och alltså blockera aktuell tråd till dess att en Task har avslutats.
TaskCompletionSource
2019-04-15
I C# finns flera olika mönster för att hantera asynkronicitet. Det generella sättet att konvertera vilket mönster som helst till en Tasks är att använda en TaskCompletionSource. Därigenom gör man det möjligt att konsumera det andra mönstret via async/await.
Konvertera till och från Task
2019-04-16
När man programmerar i C#, finns det fall då man vill konvertera från ett värde till en Task, och andra situationer där man vill göra det omvända. En Task kan innehålla ett värde av vilken typ som helst, men i det här inlägget kommer jag att använda int.
Komposition: Arbeta med flera Task
s
2019-04-17
När man arbetar med Tasks i C# vill man ibland köra flera av dom parallellt, eller kanske veta när den första är avslutad. // Starta en task. var task1 = Task.Run(() => { if (!myServer.IsRunning) myServer.Start(); myMonitorService.Start(); }); // Starta ytterligare en task.