CodeGym /Kurslar /C# SELF /Fayllarla asinxron işləməyin üstünlükləri (

Fayllarla asinxron işləməyin üstünlükləri ( async/ await)

C# SELF
Səviyyə , Dərs
Mövcuddur

1. Giriş

Təsəvvür edin, sizin tətbiqiniz bir kafe kimidir. Və bu kafedə yalnız bir ofisiant işləyir (bu bizim proqramın əsas icra axınıdır). Müştəri (istifadəçi) qəhvə sifariş edir (hansısa əməliyyat), ofisiant mətbəxə gedir, qəhvəni hazırlayır və yalnız sonra stola qayıdır ki, növbəti sifarişi qəbul etsin.

İndi təsəvvür edin ki, kimdənsə... borsç sifariş gəldi. Və bu sıravi borsç deyil, iki saat bişməli olan nəhəng qazanda borsç! Ofisiant nə edəcək? O, iki saat ərzində sobada dayanacaq, heç nə etmədən, sadəcə borsçun hazır olmasını gözləyəcək. Bütün digər müştərilər oturub əl yelləyəcək, şikayət edəcəklər, amma ofisiant onları görməyəcək. Kafe "asılı" qalır, çünki ofisiant bloklanıb.

Proqramlaşdırmada buna bloklayan əməliyyat deyilir. Normal fayl oxuma və ya yazma metodunu çağıranda (məsələn, FileStream.Read() və ya StreamReader.ReadLine()), cari icra axınınız bloklanır. O, digər bütün kodun icrasını dayandırır, until I/O əməliyyatı bitənə qədər.

Baxaq sadə nümunəyə:


// "Böyük" fayl yaradacağıq demonstrasiya üçün
string largeFilePath = "LargeOrder.txt";
using (StreamWriter sw = new StreamWriter(largeFilePath))
{
    for (int i = 0; i < 1000000; i++) // 1 milyon sətir
        sw.WriteLine($"Sətir {i}: Nə isə çox vacib məlumat...");
} // Fayl burada bağlanır ki, oxumaq mümkün olsun

// !!! DIQQƏT: Bu bloklayan əməliyyatdır !!!
string content = File.ReadAllText(largeFilePath);

Bu kodu işə salın. Yazma və oxuma zamanı proqramın "donduğunu" görəcəksiniz. Konsol daxil etməni qəbul etmir, yeni mesajlar çıxmır, fayl tam oxunana qədər növbəti sətirlər icra olunmur. Yalnız bundan sonra növbəti kodlar işləyəcək.

Kiçik konsol proqramlarında bu o qədər də nəzərə çarpmaya bilər, amma təsəvvür edin:

  • Grafik interfeysli tətbiq (UI): "Faylı yüklə" düyməsinə basırsınız və proqram pəncərəsi "donur". Pəncərəni hərəkət etdirmək, digər düymələri basmaq, menyular işləmək olmur. Bu pis istifadəçi təcrübəsidir.
  • Veb-server: Server istifadəçi sorğularını emal edir. Əgər bir sorğu çox böyük fayl oxumağı tələb edirsə, diger bütün sorğular həmin axının azad olmasını gözləyəcək. Bu böyük gecikmələrə və zəif miqyaslanmaya gətirib çıxarır.

Buna görə də asinxronluğa ehtiyacımız var!

2. Fayllarla asinxron işləməyin üstünlükləri

Asinxronluq diski daha sürətli etmir. Disk eyni sürətlə işləyəcək. Asinxronluq o deməkdir ki, yavaş əməliyyat bitənə qədər gözləmirik, bunun əvəzinə icra axınını digər işlər üçün azad edirik.

Kafemizə qayıdaq. İndi ofisiant ağıllı və çoxvəzifəlidir. Müştəri "ÇOX BÖYÜK BORSÇ" sifariş verəndə (böyük fayl oxuma), ofisiant sobada dayanmaz. O, borsçı bişməyə qoyur və vaxt itirmədən zalə qayıdır, digər sifarişləri qəbul edir, qabları yığır, digər müştərilərə xidmət edir. Borsç hazır olanda mətbəx ona xəbər verəcək, o qayıdıb borsçu götürəcək və müştəriyə çatdıracaq.

Açar fərq: ofisiant bloklanmır borsçu gözləyərkən. Bu zamanı məhsuldar şəkildə başqa işlə məşğul olur.

Tətbiqin cavabdehliyi (User Interface Responsiveness)

Bu, çox güman ki, masaüstü və mobil tətbiqlər üçün ən nəzərəçarpan və vacib üstünlükdür. Əgər proqramınız nəsə uzun müddət edirsə (faylı oxuyur, internetdən data yükləyir, böyük məlumatı emal edir), asinxron yanaşma imkan verir:

  • UI-nın interaktivliyini saxlamaq: İstifadəçi digər düymələri basmağa, pəncərələri hərəkət etdirməyə, başqa məlumatlara baxmağa davam edə bilər, arxa planda ağır əməliyyat gedir.
  • Proqress göstəricilərini göstərmək: Yükləmə animasiyası və ya progress bar göstərərək istifadəçiyə proqramın donmadığını, işlədiyini bildirmək olar.

Təsəvvür edin ki, ofisiant faylı oxuyarkən "donan" konsol əvəzinə siz onun başqa "sifarişləri" qəbul etdiyini görürsünüz (məsələn, başqa mesaj göstərmək və ya istifadəçi inputuna reaksiya vermək), fayl oxuma isə arxa planda gedir. Bu xeyli yaxşıdır!

Resursların effektiv istifadə və miqyaslanma

Bu server tətbiqləri (məsələn, veb-servislər, API-lər, backendlər) üçün kritik əhəmiyyətlidir, hansı ki, çoxlu istifadəçiləri eyni anda servis etməlidirlər.

  • Axınları boşuna xərcləmirik: Sinkron modeldə hər "uzun" istifadəçi sorğusu serverdə bir axını bloklayır. Əgər sizdə 1000 belə sorğu varsa, sizə 1000 axın lazımdır. Hər axın yaddaş və CPU resursu sərf edir. OS axınlar arasında keçidi idarə edir. Asinxronluq eyni axına I/O bitməyini gözləyərkən başqa sorğunu emal etməyə icazə verir. I/O bitən kimi o əvvəlki sorğuya qayıdır.
  • CPU-nu azad edirik: Məlumat diskdən oxunarkən və ya şəbəkə ilə ötürülərkən CPU boş dayanır. Asinxronluq bu vaxtı başqa faydalı hesablamalara sərf etməyə imkan verir.
  • Daha az yaddaş: Aktiv axınların sayı az olduqda serverin RAM istehlakı da azalır.

3. Kodun sadələşməsi (C# ilə async/await)

Əvvəllər asinxron kod yazmaq çətin, uzun və səhvə meyilli idi. Axınları, callbacks və sinxronizasiyanı əl ilə idarə etmək lazım idi. Bu, tam qaranlıqda LEGO-dan kosmik stansiya qurmağa oxşayırdı.

Amma C#-a asyncawait açar sözləri gəldi. Bu bir növ sehrli çubuq kimidir — asinxron kodu sanki sinkron kimi oxunaqlı yazmağa imkan verir. Siz sadəcə kompilyatora bildirirsiniz: "Burada uzun müddət çəkə bilər, gözlə, amma bütün dünyanı bloklama".


// BU NÜMUNƏDİR, asinxron kod necə görünə bilər (hələ dərin izah yox)
// Gələn mühazirələrdə bunu detallı şəkildə araşdıracağıq!

public static async Task Main(string[] args) // Asinxron Main belə görünəcək
{
    Console.WriteLine("Proqram ÇOX BÖYÜK FAYLI asinxron oxumağa başlayır...");

    Stopwatch stopwatch = Stopwatch.StartNew();
    
    // !!! DIQQƏT: Asinxron əməliyyat !!!
    await File.ReadAllTextAsync(largeFilePath); // Bu axını bloklamır
    
    stopwatch.Stop();

    Console.WriteLine($"Fayl oxundu! Xərclənən vaxt: {stopwatch.ElapsedMilliseconds} ms.");
    // Fayl oxunarkən başqa işlər də edilə bilərdi!
}

Diqqət edin: asinxronluq I/O əməliyyatını disk səviyyəsində sürətləndirmir. 1 GB faylın oxunması 15 saniyə çəkirsə, bu müddət qalır. Fərq ondadır sizin processor və axınlar edir həmin 15 saniyə ərzində. Sinkron halda onlar boş dayanırlar, asinxron halda — digər vəzifələri icra edirlər.

Qısa müqayisə cədvəli:

Xüsusiyyət Sinkron əməliyyat (adi Read/Write) Asinxron əməliyyat (ReadAsync/WriteAsync)
İcra axını Bloklanır əməliyyat bitənə qədər Bloklanmır, digər işlər üçün azad olur
UI cavabdehliyi Tətbiq "donur" Tətbiq interaktiv qalır
CPU istifadəsi I/O gözləyərkən boş dayanır I/O gözləyərkən digər işləri görmək olar
Miqyaslanma Aşağı (eyni anda çox əməliyyat üçün çox axın tələb olunur) Yüksək (az sayda axınla çox sorğu emal oluna bilər)
Yazmaq çətinliyi Sadə Əvvəl çətin idi, amma async/await bunu xeyli asanlaşdırdı
I/O sürəti Dəyişmir Dəyişmir (sürət diskdən asılıdır)
Nə vaxt istifadə etməli? Qısa, sürətli əməliyyatlar üçün Hər hansı potensial uzun əməliyyatlar üçün (I/O, şəbəkə, DB)

Əsasən, asinxronluq tətbiqinizi daha responsivemiqyaslana bilən edir, xüsusən də xarici, yavaş resurslarla (fayl sistemi, şəbəkə) işləyərkən. Bu, buffer-lamanı əvəz etmir, onu tamamlayır. Buffer-lama datanın ötürülməsini sürətləndirir, asinxronluq isə proqramın həmin ötürmə zamanı mənasız dayanmasını önləyir.

4. Arxada nə baş verir

Real dünya nümunəsi: video redaktorlar, oyunlar, saytlar

Demək olar ki, bütün müasir böyük fayllarla işləyən proqramlar asinxron yanaşmalardan istifadə edir. Populyar media playerlər film yükləyərkən interfeysi bloklamır. Serverlər bir müştəri böyük fayl yükləyəndə "donmur". Hətta backup proqramı və ya bulud client də işləri "arka planda" edir ki, istifadəçi paralel işləyə bilsin.

Sadə dildə necə işləyir

.NET-də asinxron fayl metodları (məsələn, ReadAsync, WriteAsync) əslində əməliyyat sisteminin imkanlarından istifadə edir ki, uzun əməliyyat zamanı proqram axınını bloklamasın. Bu sistem çağırışları vasitəsilə olur: "Mənə bu faylı oxu, bitəndə məni xəbərdar et".

Vizual element: asinxron oxuma necə işləyir (sxem)

sequenceDiagram
    participant UserCode as Sizin kod
    participant OS as Əməliyyat sistemi
    participant Disk as Disk

    UserCode->>OS: Asinxron fayl oxuma sorğusu
    OS->>Disk: Məlumatı oxuyur
    UserCode->>UserCode: Digər vəzifələri icra etməyə davam edir
    OS->>OS: Oxumanın bitməsini gözləyir
    Disk-->>OS: Məlumat hazırdır
    OS-->>UserCode: Oxumanın bitməsi barədə xəbərdarlıq
    UserCode->>UserCode: Məlumatı emal edir

5. Harada asinxron əməliyyatlar ən çox fayda verir

  • Grafik interfeysli tətbiqlər (UI bloklanmır).
  • Fayllara çoxsaylı eyni vaxtlı sorğular göndərən serverlər.
  • Avtomatlaşdırılmış böyük həcmli məlumat emalı skriptləri (məsələn, backup).
  • Yavaş və ya şəbəkə üzərindən əldə olunan disklerle işləyən alətlər.

Məlumat daha çox və yaddaş da yavaşdırsa — asinxronluğun üstünlüyü daha çox nəzərə çarpacaq. Hətta böyük tətbiq yazmasanız belə, Async-metodlara öyrəşmək faydalıdır: bu, müasir C#-ın standardlarından biridir.

İndi bilirsiniz ki, fayllarla asinxron işləmək sadəcə modadan deyil, .NET 9-da sürətli və responsive tətbiqlər yaratmaq üçün vacib bir texnikadır. Gələn mühazirələrdə sintaksisə, praktika və ReadAsync, WriteAsync və onların həmkarlarına tipik istifadə hallarına daha dərindən baxacağıq!

6. Asinxronluq

Asinxronluğun necə işlədiyini 55-62 səviyyələrində hissə-hissə öyrənəcəyik. İndi sadəcə tanış olmaq istədim. Əgər bu səviyyədə heç nə başa düşməsəniz — heç nə olmur. Sadəcə bu mühazirəni və tapşırıqları sonra atlaya bilərsiniz və asinxronluğu öyrəndikdən sonra geri dönə bilərsiniz.

Paralellik və asinxronluq qarşılaşdırılması

Bir neçə Windows tətbiqini eyni kompüterdə açıb onlar eyni vaxtda nəsə edirsə, proqramçılar deyəcəklər ki, vəzifələr paralel icra olunur.

Amma oyunu telefonda minimizə edib başqa şeylə məşğul olsanız və oyun dayanmış vəziyyətdə olsa, bu asinxron işə daha yaxındır. Asinxronluq həqiqətən paralel icradan daha çox eyni zamanda gözləmək deməkdir.

Nümunə

Tutaq ki, ev işləri ilə məşğulsunuz. Qabyuyan maşını işə saldınız, o iş görərkən paltaryuyanı yığışdırırsınız. Paltaryuyan bitəndə, onu boşaldırsınız və piroqu sobaya qoyursunuz. Yalnız siz tək işləyirsiniz, amma bir neçə işi eyni vaxtda edirsiniz, çünki konkret əməliyyatın bitməsini gözləmək əvəzinə digər işə keçirsiniz.

Paltaryuyan bitəndə sizə siqnal gəlir və siz yenidən ona qayıdırsınız. Paltaryuyan "sizin onu gözlədiyinizi" düşünə bilər, amma əslində siz həmin vaxtda başqa işlə məşğul idiniz.

Eyni anda qabyuyanı yükləmək, piroqu sobaya qoymaq və paltaryuyanı boşaltmaq mümkün deyil. Amma nəyinsə məşğul olduğu müddətdə siz boş dayanmaq məcburiyyətində deyilsiniz, vaxtı səmərəli istifadə edə bilərsiniz.

Vacib nüans

Əgər yalnız bir tapşırığınız varsa, "tapşırığın bitməsini gözləmək" ilə "gözləmə zamanı başqa işlər görmək" arasında fərqi hiss etməyəcəksiniz. Amma tapşırıqlar çoxdursa, fərq böyük olacaq.

7. Tipik səhvlər və tələlər

Ən yayılmış səhv: sadəcə asinxron metodu çağırmaqla hər şeyin sehrli şəkildə sürətləndiyini düşünmək. Əslində, əgər düzgün istifadə edilməzsə (məsələn, await-i unutmaq), kod "proqnozlaşdırılmaz" olur: nəticə hələ hazır deyil, amma proqram onu artıq istifadə edir. Qrafik tətbiqlərdə event handler-ların demək olar ki həmişə asinxron olması lazımdır, yoxsa UI "donacaq".

Bir daha: asinxronluq I/O-nun oxunmasını/yazılmasını sürətləndirmir, amma yavaş əməliyyatlar zamanı tətbiqinizin effektiv və responsive olmasına imkan verir.

Nə olacaq sonra?

İndi artıq niyə asinxronluğa ehtiyacımız olduğunu başa düşdünüz, növbəti mərhələ onu necə istifadə etməyi öyrənməkdir. Gələn mühazirədə faylların asinxron oxunması və yazılması sintaksisinə dərindən baxacağıq, metodların asinxron versiyaları ilə tanış olacağıq (məsələn, ReadAsyncWriteAsync) və ilk real asinxron kodumuzu yazmağa başlayacağıq! Maraqlı olacaq, kanal dəyişməyin!

2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Faylı asinxron oxumaq
Faylı asinxron oxumaq
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION