skip to Main Content
Asenkron (Eş Zamansız) Fonksiyonlar

Asenkron (Eş zamansız) Fonksiyonlar

Dart nesneye yönelik ve senkron şekilde çalışan bir programlama dilidir. Senkron dediğimiz kavram ise şudur: Kodlar yukarıdan aşağıya doğru sırayla işlenir ve bir satırdaki işlem bitmeden diğer satıra geçilmez. Asenkron yapıda ise uzun zaman alan veya farklı görevdeki işlemler aynı anda gerçekleştirilir. Bu kavram paralel programlama ile çok karıştırılmaktadır. Paralel programlamada işlemci üzerinde farklı görevler farklı thread’ler üzerinde çalıştırılır. Asenkron programlamada ise kaba tabirle “sen diskten veri okurken, ben o sırada ekrana mesaj basayım” anlayışı vardır.

Aşağıdaki örneği inceleyelim. Burada 3 tane fonksiyon tanımlanmıştır ve sırası ile fonksiyonlar çağrılmıştır. 2. fonksiyonda for döngüsü yardımı ile biraz zaman alan bir işlem gerçekleştirilmiştir. Normal senkron programlamada 2. fonksiyonun çağrıldığı satıra geldiğinde program o fonksiyonun bitmesini bekler. Fakat asenkron yapıda ise 2. fonksiyonun sonucunu beklemeden sıradaki kod çalıştırılır. Yani fonksiyon 3 e atlanır. İşlem bu şekilde devam eder ve sonlanır.

void function1() {
  print("Function 1");
}

Future function2() async {
  await null;
  for(int i = 0; i < 1000000000; i++);
  print("Function 2");
}

void function3() {
  print("Function 3");
}

// Kullanımı
function1();
function2();
function3();

// Çıktı:
Function 1
Function 3
Function 2

Yukarıda görmüş olduğunuz gibi işlemler asenkron gitti. Burada dikkat etmeniz gereken nokta Dart 2 ile gelen güncellemedir.  Asenkron fonksiyonlarda işleme sonuçları bazen bekletilmek istenebilir. Bunun için await ifadesi kullanılır. Dart dilinin önceki sürümlerinde asenkron fonksiyonlarda sadece async ifadesinin kullanılması yeterli iken Dart 2’den sonra, asenkron bir fonksiyon tanımlarsanız bu fonksiyonun await ifadesi yok ise onu null yapmalısınız. (await null;)

Asenkron fonksiyonlar Future sınıfını geriye döndürür.  Bu sınıf jenerik bir değer alan sınıftır. Yani bir değer döndürmek istiyorsanız, o değerin türünü Future sınıfına bildirmelisiniz. Future sınıfı size bir callback işlevi sunar. Böylece işleminiz bittiğinde ne olacağına karar verebilirsiniz. Örneğin kullanıcı internet üzerinden bir dosya indirecek fakat dosyanın boyutu çok büyük. Siz bu fonksiyonu asenkron bir biçimde tanımladınız. Daha sonra Future sınıfının then metodu ile işlem bittiğinde ne yapılacağını kodlayabilirsiniz.

Future<String> asyncFunction() async {
  await null;
  for(int i = 0; i < 1000000000; i++);
  print("Async Function");
  return "Completed";
}
// Kullanımı
asyncFunction().then((String message) => print(message));

// Çıktı:
Async Function
Completed
This Post Has One Comment

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir