iToverDose/Yazılım· 25 MAYIS 2026 · 08:03

Dart'ta Asenkron Fonksiyonlarla Uygulama Performansını Artırma

Dart uygulamanızda bloklanmayı kaldırarak kullanıcı deneyimini nasıl iyileştirebilirsiniz? Tek iş parçacığı modelinde asenkron fonksiyonların çalışma mantığını ve `async`/`await` kullanımını keşfedin.

DEV Community3 dk okuma0 Yorumlar

Dart programlama dilinde senkron fonksiyonlar, işlemciyi meşgul ederken diğer görevleri engelleyebilir. Bu durum, özellikle kullanıcı arayüzü (UI) uygulamalarında istenmeyen gecikmelere yol açar. Neyse ki Dart, tek bir iş parçacığı üzerinde bile asenkron çalışmayı mümkün kılan özel yapılar sunar. Bu yapıları doğru şekilde kullanarak, uygulamanızın yanıt verme süresini önemli ölçüde artırabilirsiniz.

Dart’ta Asenkron Programlamanın Temelleri

Dart’ta asenkron fonksiyonlar, async ve async* anahtar kelimeleriyle tanımlanır. Bu fonksiyonlar, işlemciyi bloklamadan arka planda çalışır ve sonuçlarını Future ya da Stream nesneleri aracılığıyla iletir. Dart dil belirtimine göre:

  • async ile tanımlanan fonksiyonlar, bir Future nesnesi döndürür.
  • async* ile tanımlananlar ise bir Stream nesnesi oluşturur.

Bu yapılar sayesinde, uzun süren işlemler (örneğin ağ istekleri veya dosya okuma) sırasında uygulamanızın kullanıcı arayüzü sorunsuz çalışmaya devam eder.

Future ve await ile Sonuçları Yönetme

Asenkron fonksiyonların en büyük avantajı, await ifadesiyle sonuçları senkron bir şekilde alabilmenizdir. Örneğin, bir Future<int> döndüren bir fonksiyonu çağırdığınızda, doğrudan sonucu elde etmek için await kullanabilirsiniz:

Future<int> asyncToplama(int x, int y) async {
  return x + y;
}

void main() async {
  // Gelecek nesnesini doğrudan yazdırır
  print(asyncToplama(3, 5));
  
  // Sonucu bekleyerek alır
  int sonuc = await asyncToplama(3, 5);
  print(sonuc); // 8
}

Yukarıdaki örnekte, ilk print ifadesi Instance of 'Future<int>' çıktısını verirken, ikinci ifade doğrudan 8 değerini yazdırır. Bu yaklaşım, uygulamanızın akışını daha okunabilir ve yönetilebilir hale getirir.

Stream ile Sürekli Veri Akışı Oluşturma

async* anahtar kelimesi, sürekli veri akışı sağlamak için kullanılır. Örneğin, bir sayı dizisini art arda üretmek için Stream oluşturabilirsiniz:

Stream<int> sayiUretici(int baslangic, int bitis) async* {
  if (baslangic > bitis) {
    throw Exception("Başlangıç değeri bitişten büyük olamaz");
  }
  
  for (int i = baslangic; i <= bitis; i++) {
    yield i;
    await Future.delayed(Duration(milliseconds: 200));
  }
}

void main() async {
  await for (int sayi in sayiUretici(1, 5)) {
    print(sayi);
  }
}

Bu kod, 1’den 5’e kadar olan sayıları 200 milisaniye aralıklarla ekrana yazdırır. Stream yapısı, sürekli veri akışı gerektiren uygulamalarda (örneğin gerçek zamanlı veri izleme) oldukça kullanışlıdır.

Asenkron Programlamanın Uygulama Örnekleri

Asenkron fonksiyonların kullanım alanları oldukça geniştir. İşte bazı yaygın senaryolar:

  • Ağ istekleri: API’lere yapılan çağrılar bloklanmadan gerçekleştirilir.
  • Dosya işlemleri: Büyük dosyaların okunması veya yazılması sırasında UI donmaz.
  • Veritabanı sorguları: Uzun süren sorgular arka planda çalışır.
  • Zamanlayıcılar: Belirli aralıklarla tekrarlanan işlemler için Timer kullanımı.

Aşağıda, basit bir API çağrısını simüle eden bir örnek bulunmaktadır:

Future<String> apiCagrisiSimulasyonu() async {
  await Future.delayed(Duration(seconds: 2)); // 2 saniye bekleme
  return "Veri başarıyla alındı";
}

void main() async {
  print("Veri bekleniyor...");
  String sonuc = await apiCagrisiSimulasyonu();
  print(sonuc); // "Veri başarıyla alındı"
}

En İyi Uygulamalar ve Yaygın Hatalar

Asenkron programlamada dikkat edilmesi gereken bazı noktalar vardır:

  • Hataları doğru şekilde yönetin: try-catch bloklarını await ifadelerinin etrafında kullanın.
  • Bloklanmayı önleyin: Uzun süren işlemleri asenkron fonksiyonlara bölün.
  • `Future` ve `Stream` nesnelerini doğru yönetin: Bellek sızıntılarını önlemek için kaynakları serbest bırakın.
  • `await` kullanımını optimize edin: Gereksiz await ifadeleri performansı düşürebilir.

Örneğin, birden fazla Future nesnesini paralel olarak çalıştırmak için Future.wait kullanılabilir:

Future<void> paralelIslemler() async {
  var gelecek1 = Future.delayed(Duration(seconds: 1), () => "İşlem 1 tamamlandı");
  var gelecek2 = Future.delayed(Duration(seconds: 2), () => "İşlem 2 tamamlandı");
  
  var sonuçlar = await Future.wait([gelecek1, gelecek2]);
  sonuçlar.forEach(print);
}

Dart’ın asenkron programlama modeli, uygulamanızın performansını ve kullanıcı deneyimini doğrudan etkiler. Bu yapıları doğru şekilde kullanarak, daha akıcı ve yanıt veren uygulamalar geliştirebilirsiniz. Unutmayın, asenkronlik konusunda ustalaşmak biraz pratik gerektirir; bu nedenle basit projelerden başlayarak denemeler yapmanız önemlidir. Gelecek içeriklerde Future ve Stream sınıflarının derinlemesine incelenmesini ele alacağız.

Yapay zeka özeti

Dart uygulamalarınızda bloklanmayı kaldırın. Asenkron fonksiyonlar, `async`/`await` ve `Stream` kullanarak performansı artırın ve kullanıcı deneyimini iyileştirin.

Yorumlar

00
YORUM BIRAK
ID #KR7EG2

0 / 1200 KARAKTER

İnsan doğrulaması

7 + 9 = ?

Editör onayı sonrası yayına girer

Moderasyon · Spam koruması aktif

Henüz onaylı yorum yok. İlk yorumu sen bırak.