Asenkron operatsiyani kechiktirish va Task.Delay
await PrintAsync(); // вызов асинхронного метода
Console.WriteLine("Некоторые действия в методе Main");
// определение асинхронного метода
async Task PrintAsync()
{
await Task.Delay(3000); // имитация продолжительной работы
// или так
//await Task.Delay(TimeSpan.FromMilliseconds(3000));
Console.WriteLine("Hello METANIT.COM");
}
Asinxroniyaning afzalliklari
PrintName("Tom");
PrintName("Bob");
PrintName("Sam");
void PrintName(string name)
{
Thread.Sleep(3000);
Console.WriteLine(name);
}
Asinxron lambda ifodasini aniqlash
Asinxron usulning qaytish turi bekor bo'lishi kerak, void, Task yoki ValueTask
Void kalit so'zidan foydalanilganda, asinxron usul hech narsani qaytarmaydi:
PrintAsync("Hello World");
PrintAsync("Hello Temur");
Console.WriteLine("Main End");
await Task.Delay(3000);
// определение асинхронного метода
async void PrintAsync(string message)
{
await Task.Delay(1000); Console.WriteLine(message);
}
Task
Task turidagi ob'ektni qaytarish:
await PrintAsync("Hello Temur");
// определение асинхронного метода
async Task PrintAsync(string message)
{
await Task.Delay(1000);
Console.WriteLine(message);
}
Task
Usul ba'zi qiymatlarni qaytarishi mumkin. Keyin qaytariladigan qiymat Task ob'ektiga o'raladi va qaytish turi Task:
int n1 = await SquareAsync(5);
int n2 = await SquareAsync(6);
Console.WriteLine($"n1={n1} n2={n2}"); // n1=25 n2=36
async Task SquareAsync(int n)
{
await Task.Delay(0);
return n * n;
}
ValueTask
ValueTask turidan foydalanish Task-dan foydalanish bilan deyarli bir xil, xotira bilan ishlashda ba'zi farqlar mavjud, chunki ValueTask ko'proq maydonlarni o'z ichiga olgan tuzilmadir. Shuning uchun, Vazifa o'rniga ValueTask-dan foydalanish ko'proq ma'lumotlarni nusxalashga olib keladi va shunga mos ravishda qo'shimcha xarajatlarni yaratadi.
ValueTask ning Vazifadan ustunligi shundaki, bu tur uyada qo'shimcha xotira ajratishdan qochadi. Misol uchun, ba'zida siz sinxron ravishda ba'zi qiymatlarni qaytarishingiz kerak. Shunday qilib, keling, quyidagi misolni olaylik:
var result = await AddAsync(4, 5);
Console.WriteLine(result);
Task AddAsync(int a, int b)
{
return Task.FromResult(a + b);
}
Dostları ilə paylaş: |