WORDS
Konvertera till och från Task
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
.
int
→ Task<int>
Det finns tre sätt att gå från ett värde till en Task
:
FromResult
: Används om man har ett färdigt värde.Run
: Används när man behöver beräkna ett värde.async
: Bör endast användas när man också använderawait
, för annars kommer metoden ändå exekveras synkront.public void FromInt1() { // 1. FromResult Task<int> task = Task.FromResult(4); // 2. Run Task<int> task = Task.Run(() => 2 + 2); } // 3. async public async Task<int> FromInt2() { int result = 2 + 2; return result; }
Task<int>
→ int
Det finns två sätt att gå från en Task
till ett värde:
await
: Detta sätt är oftast att föredra. Det kräver att den omslutande metoden är deklarerad somasync
.Result
: Om man inte kan deklarera sin metod somasync
, så kan denna property användas.public async void ToInt() { Task<int> task = CalculateSomething(); // 1. await int result = await task; // 2. Result int result2 = task.Result; }
Något annat → Task<int>
Det finns många mönster för att hantera asynkronicitet i C#, och ibland vill man konvertera från ett annat system till att använda Task
s. Exempel på andra system kan vara event och återanrop (callbacks).
TaskCompletionSource.SetResult
: Det mest flexibla sättet att skapaTask
s på.var completion = new TaskCompletionSource<int>(); completion.SetResult(4); Task<int> task = completion.Task;