• Anasayfa
  • Hakkımızda
  • Etkinlikler
  • Destek Verin
  • Site Haritası
  • Giriş Yap
  • Üye Ol
  • Facebook
  • Twitter
  • RSS
Yazılım Dilleri
  • Soru - Cevap
  • EĞİTİM SETİ
  • KATEGORİ
  • DUYURU
  • TEKNOLOJİ HABERLERİ

Son Sorular

  • 8/2/2020 11:38:31 PM'Basit' Yazılım Dili
  • 6/25/2020 3:18:13 PMderleme hatası
  • 12/11/2017 4:49:15 PMWindows Hizmeti Hk.
  • 4/23/2016 12:55:33 AMC programlama 2 oyun

Popüler Sorular

  • 5/27/2012 5:49:50 AMAsp.Net ile Date time alana veri ekleyemiiyorum ?
  • 4/2/2012 12:45:18 AM.exe uzantılı dosya için dijital imza nerde nasıl alınır.
  • 5/12/2012 8:44:49 AMAcil Yardım
  • 5/27/2012 1:46:51 PMveri tabanı bağlantısı
  • .Net Framework
  • 8085 Assembly
  • Active Directory
  • ADO.NET
  • Android
  • Apple IOS
  • Arduino
  • ASP.NET
  • ASP.NET MVC
  • Blackberry
  • C#.Net
  • C++
  • CCG Framework
  • CISCO
  • CSS
  • Diğer
  • Dreamweaver
  • Entity Framework
  • Exchange Server
  • Gömülü Sistemler
  • GSM Programlama
  • Güncel
  • Güvenlik
  • HTML5
  • Java
  • Javascript / JQuery
  • Jira
  • Kariyer ve İş Yaşamı
  • LibreOffice
  • LINQ
  • Linux
  • Matlab
  • Microsoft Dynamics CRM
  • Mobil Uygulama Geliştirme
  • MySQL
  • NoSQL
  • Oracle
  • OWIN
  • PFSense
  • PHP
  • Powershell
  • Python
  • Sanallastirma
  • SAP-ABAP
  • SCOM 2012
  • SEO
  • Sharepoint 2010
  • Sharepoint 2013
  • Silverlight
  • Sistem Analiz ve Tasarımı
  • SQL Server
  • Symantec
  • TFS
  • T-SQL
  • Ubuntu
  • VB.NET
  • Veritabanı Yönetim Sistemleri
  • Visual Studio
  • VMware
  • WCF
  • Web Hosting
  • Windows 8
  • Windows Azure
  • Windows Phone 7.1
  • Windows Phone 8
  • Windows Server
  • Wordpress
  • WPF
  • Xamarin
  • XNA
  • Yazılım Mühendisliği
  • Yöneylem Araştırması
  • ASP.NET MVC
  • Entity Framework
  • Javascript / JQuery
  • LINQ
  • PHP

Son Duyurular

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

C# Asenkron Programlama - Async ve Await anahtar kelimeleri

Async ve Await anahtar kelimeleri ve threadler

11.07.2014

Yazar: Ferhat Kortak (Google+)

Kategori: C#.Net

5632

Merhabalar. Bu makalemde hayatımıza C# 5.0 ile beraber gelen asenkron programlama muhabbetinden bahsedeceğim. Teoriyi anlatıp bir örnekle pratiğe dökmeye çalışacağım.
 

Asenkron Programlama Nedir


Önce bir cümleyle açıklayalım. Asenkron programlama, işin parçalara ayrılıp tüm işlemlerin aynı anda sürdürülmesini sağlar. Asenkron Programlama ile programımız içerisinde yazdığımız bir kod işletilirken, aynı program içerisinde diğer kodlar da işletilebilir. Bu sayede kullanıcı programımızın bir bölümünü kullanırken, başka bir bölümü ile de işlem yapabilir. Bu özellikle mobil uygulamalar için hayati bir önem taşıyor. Mobil haricinde de birçok kullanım alanı var.

Asenkron programlama, multi threading ile karıştırılmamalıdır. Asenkron olarak yazacağımız kodlar tek bir thread üzerinde de çalışabilir. Asenkron programlamanın özelliği farklı thread’lerde çalışması değil, verdiğimiz işi parçalara ayırarak programımız üzerinde birden fazla işin aynı anda yürütülmesini sağlamaktır.
 

Asenkron Programlamada Async ve Await Anahtar Kelimeleri


C# 5.0 ile gelen asenkron programlama tekniğini kullanmak için async ve await anahtar kelimlerine ihtiyaç duyuyoruz. Normal olarak çalışan bir metodu asenkron hale getirmek istiyorsak, metodu tanımlarken async kullanırız daha sonrasında ise kullanacağımız kod satırının önüne await anahtar kelimesini getiririz. Metodu tanımlarken async kullanmamızın sebebi bu yazdığımız metod içerisinde asenkron kod parçaları yazacağımızı CLR’a bildirmemiz gerektiğinden kaynaklanıyor. Await’i de asenkron olarak çalışmasını istediğimiz kodları seçiyoruz.
 

Örnekler

 
Örnekleri Windows Form Application üzerinde göstereceğim. Öncelikle siz de yeni bir tane Windows Form Application oluşturun. Hemen aşağıda form görüntüsünü paylaşayım.

3 tane farklı örnek yapacağım. Birincisinde Asenkron olarak bir web sayfasının html kodlarını bir string’e çekip mesaj olarak göstereceğim. Bunu senkron ve Asenkron olarak 2 farklı şeklide yapacağım.

İkincisinde yine asenkron ve senkron olmak üzere bir picturebox’a internetten resim alacağım.

Üçüncü örnekte ise sadece bir mesaj göstereceğim. Ancak bu mesajdan önce thread’i uykuya alacağım. Bu süre içerisinde senkron yazdığımız kodlar işlenirken arayüzün çalışmadığını ancak asenkron kodlar işlenirken arayüzün hiçbir şekilde aksamaya uğramadığını göreceksiniz. Başlayalım :)

Birinci örnekten başlayalım. Kodlarını aşağıda vereyim ve açıklamasını yapayım.


 

 

  
private void btnNormalString_Click(object sender, EventArgs e)
        {
            DownloadData(); //DownloadData metodunu çağırıyoruz...
        }

        private async void btnAsyncString_Click(object sender, EventArgs e) //Async keyword'üne dikkat!
        {
            string getdata = await DownloadDataAsync(); //await keyword'üne dikkat!
            MessageBox.Show(getdata);
        }

        private void DownloadData()
        {
            WebClient wc = new WebClient(); //WebClient Sınıfından yeni bir WebClient nesnesi türetiliyor...
            string data = wc.DownloadString("http://w3schools.com");
            //Ürettiğimiz wc isimli nesnenin DownloadString metoduyla w3schools kaynağındaki html kodlarını çekip değişkene aktarıyoruz
            MessageBox.Show(data); 

        }

        async Task<string> DownloadDataAsync() //DownloadDataAsync Task'inin asenkron olduğunu async keyword'ü ile belirtiyoruz. Asenkron kullanmak istediğimiz için Task oluşturduk.
        {
            WebClient wc = new WebClient(); //WebClient Sınıfından yeni bir WebClient nesnesi türetiliyor...
            string data = await wc.DownloadStringTaskAsync("http://w3schools.com");
            //Ürettiğimiz wc isimli nesnenin DownloadString metoduyla w3schools kaynağındaki html kodlarını çekip değişkene aktarıyoruz
            return data; //Veri kaynağından çektiği verileri tekrar döndürüyor. Böylece bu metodu çağıran yere bu bilgi ulaşmış oluyor.
        }

Kodların açıklama satırlarında her kodun işlevini tek tek yazmaya çalıştım. Genel olarak anlatırsam 2 tane işlenecek metod var. Birisi DownloadData olan standart metod. Diğeri ise DownloadAsyncData olan asenkron metod. İkisi de aynı işi yapıyor. Ancak iş yapılırken oluşan farka gelecek olursak, senkron olanda kullanıcı işlem yapılırken uygulamamız içerisinde başka hiçbir işlem yapamıyor. Asenkron olarak yürütülen işlemde ise kullanıcı uygulama içerisinde başka işlemler de yapabiliyor. Asenkron programlamanın amacı da budur. Kimse kum saati görmek istemez :)

İkinci örneğin kodları :

 private void btnNormalPicture_Click(object sender, EventArgs e) //Normal metod.
        {
            pictureBox1.Load("http://cdn.memegenerator.net/instances/500x/34330403.jpg");
        }

        private void btnAsyncPicture_Click(object sender, EventArgs e) 
        {
            pictureBox1.LoadAsync("http://cdn.memegenerator.net/instances/500x/34330403.jpg"); //Hazır bir async metod.
        }

Bu örnekte async/await yok. Ancak hazır bir asenkron metod olduğu için aldım. Temel olarak yine aynı işi yapıyor. Bunun gibi hazır asenkron metodlar da .Net Framework içerisine yerleştirilmiş durumda.

Üçüncü örneğimiz ise bu konuyu araştırırken internette gördüğüm klasik bir örnek. Thread.Sleep metodu kullanarak kullanılan thread bir süreliğine donduruluyor. Ve program asenkron ve senkron olarak bu kodları işletirken, programın verdiği tepkilere bakılıyor. Tabi ki senkron metod işletilirken yine programa müdahale edilemiyor. Ancak senkron metod işletilirken sıkıntı yok. Yine yorum satırlarında açıklama yapmaya çalıştım.

 private void btnNormalSleep_Click(object sender, EventArgs e)
        {
            NormalMessage(); //NormalMessage metodunu çağırıyoruz...
        }

        private async void btnAsyncSleep_Click(object sender, EventArgs e)
        {
            await ShowAsyncMessage(); //ShowAsyncMessage metodunu asenkron olarak çağırıyoruz...
        }

        async Task ShowAsyncMessage() //async keyword'ü ile yeni bir Task türetiyoruz...
        {
            await Task.Run(() => Thread.Sleep(5000)); //5000 milisaniye işlemi durduruyoruz...
            MessageBox.Show("İşlem Tamamlandı");
        }

        private void NormalMessage() //Normal mesaj gösteren metod
        {
            Thread.Sleep(5000);
            MessageBox.Show("İşlem Tamamlandı");
        }

Asenkron metod tanımlarken bazı kurallara dikkat etmeniz gerekiyor. Örnek vermem gerekirse void ile beraber kullanılmaz. Geri dönüş tipi Task<TRESULT> olmalıdır.

Projenin tümünü aşağıdaki linkte açılan github sayfasından indirebilirsiniz.

ASYNC/AWAIT ÖRNEKLERİ

Umarım faydalı bir makale olmuştur. Sorunuz olursa lütfen iletin. İyi kodlamalar :)

Yazar Hakkında

Ferhat Kortak

Ferhat Kortak

ferhatkortak.wordpress.com

1994 İzmir doğumluyum. Çukurova Üniversitesi/Bilgisayar Programcılığı mezunuyum. Yazılım dünyasıyla ciddi olarak ilgilenmeye başlamam, meslek lisesini bitirmemle oldu. Geçmişte Windows Phone ve Windows Store Apps gibi mobil teknolojilerle ilgilendim. Şu anda C# ile ilgileniyorum. Umarım paylaşımlarım faydalı oluyordur.

Sosyal Medya

ORANLAR

  • 5632izleme

Arkadaşlarınla Paylaş

  • Tweet

0 Yorum

Yorum Yaz / Soru Sor

Lütfen yorum yazmak veya soru sormak için üye girişi yapınız.

Son Yorumlar

  • Böyle bir sayfalama ağ trafiğini hafifleti...
  • Böyle bir sayfalama ağ trafiğini hafifleti...
  • Merhaba, ellerinize sağlık çok yardımcı ol...
  • Merhaba Bu uygulama örneğinden ASP.net ...
  • Hocam Link başka sayfaya yönlendiriyor.

En Güncel Sorular

  • Bilgilendirme maili (C#.Net)
  • Power Pivot (Sharepoint 2010)
  • BigInteger, BigDecimal (Asp.Net ve Asp.Net MVC)
  • visual C# ile asp nette veritabanı islemleri (Asp.Net ve Asp.Net MVC)
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ? (Sharepoint 2010)

En Son Cevap Verilen Sorular

  • Bilgilendirme maili
  • BigInteger, BigDecimal
  • visual C# ile asp nette veritabanı islemleri
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ?
  • txt dosyasına veri yazma

Twitter

Takip et: @yazilim_dilleri

En Çok Okunanlar

Elif BAYRAKDAR

C# ile SQL Server Bağlantısı, Insert, Update ve Delete Sorguları

23.05.2013

  • 123823
  • 0
Hakan Keskin

C# ile Windows Service Projesi Oluşturma, Debug Etme ve Setup Hazırlama

17.12.2013

  • 70897
  • 0
batuhan avlayan

Php - Mail Gönderme (İletişim Formu)

02.09.2013

  • 51538
  • 0

Sponsorlar

KODLAB
Pluralsight
Exchange server is
Office 365
YAZILIM DİLLERİ
Yukarı Çık
  • Hakkımızda
  • Facebook
  • Twitter
  • RSS

© Yazılım Dillerinin Buluşma Noktası | Kaynak belirtildiği sürece makaleler kopyalanabilir.
YazilimDilleri.Net sitesinde yer alan kullanıcıların oluşturduğu tüm içeriklerin yayınlanması ile ilgili yasal yükümlülükler içeriği oluşturan kullanıcıya aittir, YazilimDilleri.Net hiçbir şekilde sorumlu değildir.

Kapat

Giriş Yap

Kullanıcı Adı

Şifre

Şifremi Unuttum

KULLANICI GİRİŞİ