C# ta asenkron programlamada kullanılan c# async await anahtar kelimelerinden bahsetmek istiyorum.

Öncelikle “Cannot find all types required by the ‘async’ modifier. Are you targeting the wrong framework version, or missing a reference to an assembly?” hatası alıyorsanız C# 5.0 ile gelen bu özellikleri C# 4.0 da kullanmaya çalışıyorsunuz demektir.

Çözüm için Microsoft.CompilerServices.AsyncTargetingPack isimli NuGet paketini projeye dahil etmeniz yeterli.

Daha sonra “This async method lacks ‘await’ operators and will run synchronously. Consider using the ‘await’ operator to await non-blocking API calls, or ‘await Task.Run(…)’ to do CPU-bound work on a background thread” uyarısını almanız olası. Bu async ile tanımladığınız bir metotda await bulamadığını dolayısı ile kodunuzun asenkron değil de senkron çalışacağını belirtiyor. Bu şu demek eğer metodumuzu oluştururken async olarak tanımladıysak muhakkak içinde await geçmeli. Aşağıdaki örneklerde görebilirsiniz.

public class Login
{
    public string Email { get; set; }
    public string Parola { get; set; }
}

Login isimli bir sınıf tanımladık. Bunu birden fazla parametreyi paket halinde asenkron metodumuza sokmak için kullanmak üzere örnek olarak oluşturdum

private async Task KontrolEt(Login grs)
{
  DataContext db = new DataContext();
  Task myTask = Task.Factory.StartNew(new Func(() =>
  {
    return db.Users.Any(x => x.Email.ToLower() == grs.Email.ToLower() && x.Password == grs.Parola);
    }));

    return await myTask;
  }

Burada KontrolEt isimli asenkron bir metot oluşturduk. Metodumuza Login sınıfından giriş bilgilerini veritabanından sorgu yapmak için kullanacağız.

private async void Button_Click_1(object sender, RoutedEventArgs e)

Butonumuzun click olayını async olacak şekilde yeniden düzenliyoruz. KontrolEt metodunu asenkron çağırmak ve bool tipinde veriye aktarmak için aşağıdaki kodu ekliyoruz.

bool isValid = await KontrolEt(new Login { Email=tbEmail.Text, Parola=tbParola.Text });

Nasıl Kullanılır?

  1. async ifadesi kullanarak bir metot, lambda ifadesi ya da anonim metot oluşturun“private async Task<bool> KontrolEt(Giris grs)“
  2. Buton tıklama gibi arayüz kontrollerine bağlı metotlar dahil olmak üzere tüm await kullanacak metotlar async ile işaretlenmek zorundadır.” private async void Button_Click_1(object sender, RoutedEventArgs e)”
  3. await sadece async ile işaretlenmiş metotlarda kullanılabilir.
  4. async ile işaretlenmiş bir metot yalnıza void, Task ve Task<T> dönüş tiplerine sahip olabilir.
  5. async ile işaretlenmiş bir metot birden fazla await içerebilir.
    Kaynaklar:
    1. http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
    2. http://www.codeguru.com/csharp/csharp/introduction-to-async-and-await-keywords-in-c-5.0.htm