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:
asyncile tanımlanan fonksiyonlar, birFuturenesnesi döndürür.async*ile tanımlananlar ise birStreamnesnesi 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
Timerkullanı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-catchbloklarınıawaitifadelerinin 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
awaitifadeleri 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.