Sobes.tech
Junior

Ի՞նչ է async և await բանալի բառերով օգտագործվող ասինխրոն ծրագրավորումը։

sobes.tech AI

Պատասխան AI-ից

Ասինխրոն ծրագրավորումը async և await-ով թույլ է տալիս իրականացնել այնպիսի գործողություններ, որոնք կարող են տևել երկար ժամանակ (օրինակ՝ մուտք-արտահոսք, ցանցային հարցումներ), առանց հիմնական հոսքը խափանելու։ Սա բարելավում է հավելվածի արձագանքման արագությունը։

  • async: Օգտագործվում է մեթոդի փոփոխիչի համար և նշում է կոմպիլատորին, որ ներսում օգտագործվելու են await օպերատորներ։ async նշված մեթոդը կարող է վերադարձնել Task, Task<T> կամ void (հակառակ դեպքում՝ void-ից պետք է խուսափել, բացի իրադարձությունների հսկիչներից)։ Վերադարձվող Task կամ Task<T> ներկայացնում է այն գործողությունը, որը դեռ չի ավարտվել։
  • await: Օգտագործվում է ասինխրոն գործողության վրա (որը վերադարձնում է Task կամ Task<T>): Երբ կատարման հոսքը հասնում է await-ին, մեթոդը "դադարեցվում" է և ազատում է ընթացիկ հոսքը։ Ասինխրոն գործողությունը կատարվում է ֆոնային ռեժիմում (կամ օգտագործում է հոսքերի պուլ, կամ օպերացիոն համակարգի մուտք-արտահոսքի մեխանիզմը)։ Երբ գործողությունը ավարտվում է, մեթոդի կատարմանը վերադառնում է նույն await-ից կամ նույն հոսքից, եթե այն հասանելի է։

Հիմնական օգտագործման օրինակ՝

// async մեթոդ, որը վերադարձնում է Task
public async Task DoSomethingAsync()
{
    // Կատարում ենք ասինխրոն գործողություն և սպասում դրա ավարտին
    await Task.Delay(1000); // Դիտարկում երկարատև գործողության
    Console.WriteLine("Async գործողությունը ավարտվեց.");
}

// async մեթոդ, որը վերադարձնում է Task<int>
public async Task<int> GetValueAsync()
{
    await Task.Delay(500);
    return 42;
}

// Օգտագործում async և await Main մեթոդում (օրինակ՝ սովորաբար գործարկվում է async Main-ով .NET Core 3.0+)
public static async Task Main(string[] args)
{
    Console.WriteLine("Սկսում...");
    
    // Կոչում ենք ասինխրոն մեթոդներ
    await DoSomethingAsync();
    int result = await GetValueAsync();
    
    Console.WriteLine($"Արդյունք: {result}");
    Console.WriteLine("Ավարտվեց.");
}

Հիմնական առավելությունը async/await-ի՝ ձեռքով հոսքերի կամ callback-ների փոխարեն՝ կոդը գրելն ու ընթերցանությունը հեշտացնելն է։ Այն գրեթե նույն տեսք ունի, ինչ սինխրոնային կոդը, բայց չի խափանում հոսքը, ինչը կարևոր է օգտագործողի ինտերֆեյսով կամ բարձր բեռով սերվերային ծրագրերում։