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 Tasks. Exempel på andra system kan vara event och återanrop (callbacks).
TaskCompletionSource.SetResult: Det mest flexibla sättet att skapaTasks på.var completion = new TaskCompletionSource<int>(); completion.SetResult(4); Task<int> task = completion.Task;