Introduktion:
Asynkron programmering har blivit en populär trend inom modern mjukvaruutveckling. Två vanliga tekniker för asynkron programmering i C# är Uppgifter och Trådar . Men många utvecklare är förvirrade över skillnaderna mellan Uppgifter och Trådar och när du ska använda var och en av dem. I den här artikeln kommer vi att se skillnaderna mellan Uppgifter och Trådar i C# och ge riktlinjer för när du ska använda var och en av dem.
Vad är uppgifter?
I C# är en Task en abstraktion på högre nivå för att köra kod asynkront. En uppgift betecknar en arbetsenhet som måste utföras asynkront, och den kan eller kanske inte returnerar ett värde. En Task skapas vanligtvis med hjälp av Uppgift Factory klass , som tillhandahåller flera metoder för att skapa och utföra uppgifter.
Uppgifter använder en Trådpool att utföra sitt arbete, vilket innebär att uppgifterna utförs på en av trådarna i Trådpool. När en uppgift skapas läggs den till i Trådpoolens kö , och en av trådarna i poolen används för att utföra uppgiften. När uppgiften är klar, återgår tråden till poolen, redo att användas för en annan uppgift.
Uppgifter har flera fördelar jämfört med trådar:
- Uppgifter är lättare än trådar. Uppgifter använder färre systemresurser, såsom minne och CPU-tid, jämfört med trådar.
- Uppgifter är lättare att hantera än trådar. Uppgifter ger en abstraktion på högre nivå för asynkron programmering, vilket gör det lättare att skriva och underhålla kod.
- Uppgifter kan också ge bättre prestanda än trådar i vissa situationer. Detta beror på att Tasks använder en Trådpool , som kan hantera trådar mer effektivt än att skapa och förstöra trådar för varje arbetsenhet.
Vad är trådar?
I C# är en tråd en abstraktion på lägre nivå för att köra kod asynkront. En tråd representerar en konstruktion på operativsystemnivå som används för att exekvera kod asynkront. En tråd kan eller kanske inte returnerar ett värde, och det skapas vanligtvis med hjälp av Trådklass .
Trådar använder sina egna resurser, såsom minne och CPU-tid, och de skapas och förstörs vanligtvis explicit av utvecklaren. När en tråd skapas börjar den köras omedelbart och den fortsätter att köras tills den uttryckligen stoppas eller slutför sitt arbete.
Trådar har flera nackdelar jämfört med Tasks:
- Trådar är tyngre än Tasks. Trådar använder mer systemresurser, såsom minne och CPU-tid, jämfört med Tasks.
- Trådar är svårare att hantera än Tasks. Trådar kräver mer programmering och synkronisering på låg nivå, vilket gör det svårare att skriva och underhålla kod.
- Trådar kan också ge sämre prestanda än Tasks i vissa situationer. Detta beror på att det kan vara ineffektivt att skapa och förstöra trådar för varje arbetsenhet, särskilt när det finns många arbetsenheter att utföra.
När ska man använda uppgifter:
Uppgifter rekommenderas när du vill utföra en arbetsenhet asynkront och du inte behöver finkornig kontroll över utförandet. Uppgifter är perfekta för att utföra små och kortlivade arbetsenheter, såsom I/O-operationer eller enkla beräkningar.
Uppgifter rekommenderas också när du vill utnyttja fördelarna med en Trådpool . A Trådpool kan hantera trådar mer effektivt än att skapa och förstöra trådar för varje arbetsenhet. Detta kan resultera i bättre prestanda, särskilt när det finns många arbetsenheter att utföra.
Uppgifter är också användbara när du vill koppla ihop asynkrona operationer. Uppgifter kan kombineras med hjälp av await-operatorn för att skapa en kedja av asynkrona operationer som körs efter varandra. Detta kan vara viktigt när du vill utföra en serie beroende asynkrona operationer.
När ska man använda trådar:
Trådar i C# bör användas när du behöver finkornig kontroll över utförandet och när du har specifika krav som inte kan uppfyllas med de abstraktioner på högre nivå som Tasks tillhandahåller. Här är några situationer där trådar kan vara det bättre valet:
Långlivade arbetsenheter:
Trådar är bättre lämpade för långlivade arbetsenheter, såsom bakgrundstjänster eller komplexa beräkningar som kräver mer kontroll över utförandet. I sådana fall är det ofta nödvändigt att kontrollera exekveringen av koden på ett mer finkornigt sätt än vad Tasks ger.
Finkornig kontroll över gängutförande:
Trådar låter dig ställa in Trådprioriteter, Trådsynkronisering , och Tråden avbryter . Om du behöver anpassa hur din kod exekveras, tillhandahåller Threads ett lågnivågränssnitt som låter dig göra det.
Programmering på låg nivå:
uppsåt uppsåt
Trådar kräver mer programmering och synkronisering på låg nivå, vilket kan vara användbart om du har specialiserade krav som inte kan uppfyllas med de abstraktioner på högre nivå som tillhandahålls av Tasks.
Interoperation med ohanterad kod:
Om du behöver samarbeta med ohanterad kod kan trådar vara det enda alternativet. I sådana fall kan du behöva skapa och kontrollera trådar manuellt för att säkerställa att din kod fungerar korrekt med ohanterad kod.
Prestandaöverväganden:
I vissa situationer kan det vara ineffektivt att skapa och förstöra trådar för varje arbetsenhet, särskilt när det finns många arbetsenheter att utföra. I sådana fall kan användning av trådar vara ett bättre alternativ eftersom de kan återanvändas för flera arbetsenheter.