• 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

  • 23.04.2016 00:55:33C programlama 2 oyun
  • 20.04.2016 16:34:41Local Database
  • 15.04.2016 14:26:15Fatura kayıt işlemi
  • 21.03.2016 01:55:30C# problem

Popüler Sorular

  • 27.05.2012 05:49:50Asp.Net ile Date time alana veri ekleyemiiyorum ?
  • 2.04.2012 00:45:18.exe uzantılı dosya için dijital imza nerde nasıl alınır.
  • 12.05.2012 08:44:49Acil Yardım
  • 27.05.2012 13:46:51veri 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ı
  • LINQ
  • LibreOffice
  • 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

WCF 4.5–Task Based Asynchronous Operasyonlar

WCF servis operasyonlarının task bazlı olarak asenkron ele alınışlarını incelemeye çalışıyoruz.

02.01.2013

Yazar: Burak Selim Şenyurt (Google+)

Kategori: WCF

8129

Yaklaşık olarak 4 dakika 38 saniye…İzleyen yazıyı benim okuma hızım bu oldu. Aslında bu süre şu demek; Öğle arasına çıkmadan bir 4 dakika 38 saniye demek bu...Ya da geldikten sonra bir 4 dakika 38 saniye demek…Ya da sabah işe erken geldiğimizde ayırabileceğimiz bir 4 dakika 38 saniye demek...Ya da servisi/otobüsü/minibüsü beklerken ayırabileceğimiz 4 dakika 38 saniye demek. Hatta Facebook’ a, Twitter’ a, Linkedin’ e, Youtube’a bakmadan geçireceğimiz bir 4 dakika 38 saniye demek… E o halde ne duruyorsunuz?Ayırın işte o zamanı Winking smile

Bilindiği üzere .Net Framework 4.5 ile birlikte altyapıya entegre olan async ve await anahtar kelimelerini kullanarak, task bazlı asenkron programlama teknikleri uygulanabilmektedir. Çok doğal olarak WCF 4.5 tarafında da bunun bir yansımasını görmekteyiz. Visual Studio arabirimi üzerinden herhangibir WCF servis referansını istemci uygulamaya eklemeye çalıştığımızda Taskbazlı operasyon desteği varsayılan olarak etkinleştirilmekte ve proxy tipi içeriğinde buna uygun metodlara yer verilmektedir. Dolayısıyla WCF(Windows Communication Foundation) servislerini kullanan istemciler, operasyon çağrılarında async ve await anahtar kelimelerinden de yararlanabilirler.

Servislerin asenkron çağrılar ile yürütülmesi, özellikle User Experience’ ın önemli olduğu uygulamalarda, ön planda yer alan konular arasındadır. Gelin bu konuyu oldukça basit bir örnek üzerinden ele almaya çalışalım. İlk olarak .Net Framework 4.5 versiyonunda bir WCF Service Application oluşturup içerisine aşağıdaki sınıf diagramında(Class Diagram) görülen tipleri ilave edelim.

OptimizationService sembolik olarak uzun süren bir optimizasyon işlemini üstelenecek şekilde planlanmıştır. Senaryo gereği istemciden bir lokasyon bilgisi almakta olan servis, bu lokasyon için en ideal yolu çıkartmaktadır. Sadece hayal ediyoruz tabi Open-mouthed smile Amacımız uzun süren bir işlem ile servis tarafının istemciye geç cevap dönmesini sağlamak ve asenkronluğu devreye almaktır.

OptimizationService içerisinde yer alan GetBestRoot operasyonu Location tipinden bir parametre alırken, geriye de Root tipinden generic bir List koleksiyonu döndürmektedir. Servis uygulamasındaki tiplerin içerikleri ise aşağıdaki gibidir.

Servis sözleşmesi(Service Contract);

using System.Collections.Generic; 
using System.ServiceModel;

namespace AzonServiceApp 
{ 
    [ServiceContract] 
    public interface IOptimizationService 
    { 
       [OperationContract] 
        List<Root> GetBestRoot(Location yourLocation); 
    } 
}

Servis sınıfı;

using System.Collections.Generic; 
using System.Threading;

namespace AzonServiceApp 
{ 
    public class OptimizationService 
        : IOptimizationService 
    { 
        public List<Root> GetBestRoot(Location yourLocation) 
        { 
            List<Root> roots=FindBestRoot(yourLocation); 
            return roots; 
        }

        private List<Root> FindBestRoot(Location yourLocation) 
        { 
            Thread.Sleep(10000);

            return new List<Root>{ 
                new Root{RootId=1,Latitude=34.5,Longitude=43.2,Altitude=500.50,Title="4ncü cadde batı köşesi"}, 
                new Root{RootId=2,Latitude=34.85,Longitude=43.2,Altitude=450,Title="moda sahil yolu"}, 
                new Root{RootId=3,Latitude=22.5,Longitude=43.2,Altitude=100,Title="iskele caddesi durağı"}, 
                new Root{RootId=4,Latitude=44.90,Longitude=12.90,Altitude=0,Title="iskelenin kendisi"} 
            }; 
        } 
    } 
}

Location tipi;

using System.Runtime.Serialization;

namespace AzonServiceApp 
{ 
    [DataContract] 
    public class Location 
    { 
        [DataMember] 
        public int LocationId { get; set; } 
        [DataMember] 
        public string Title { get; set; } 
    } 
}

Root tipi;

using System.Runtime.Serialization;

namespace AzonServiceApp 
{ 
    [DataContract] 
    public class Root 
    { 
        [DataMember] 
        public double Altitude { get; set; } 
        [DataMember] 
        public double Longitude { get; set; } 
        [DataMember] 
        public double Latitude { get; set; } 
        [DataMember] 
        public int RootId { get; set; } 
        [DataMember] 
        public string Title { get; set; } 
    } 
}

Eğer servis uygulamasını bu haliyle çalıştırıp test edersek, WCF Test Client uygulamasında yaklaşık olarak 10 saniyelik bir gecikme ile Root listesini alabildiğimizi görürüz(Nitekim GetBestRoot servis operasyonu içerisinde çağırılan FindBestRoot metodunda, Thread.Sleep ile 10 saniyelik bir gecikme uygulanmıştır)


Tabi asıl konumuz bizim geliştireceğimiz istemci uygulamalardaki task bazlı operasyon desteğidir. İstemci tarafını bir WPF Application olarak geliştirdiğimizi düşünebiliriz. Uygulamaya Add Service Reference seçeneği ile servisimizi eklemek istediğimizde, Advanced sekmesinden ulaşacağımız arabirimde yer alan Generate Task-Based Operations kutucuğunun varsayılan olarak işaretli olduğunu fark edebiliriz.


Bu duruma göre referansı eklediğimizde, istemci uygulama tarafında aşağıdaki sınıf diagramında yer alan tiplerin üretildiğini görürüz.


Dikkat edileceği üzere OptimizationServiceClient sınıfı içerisinde, geriye Task<Root[]> tipinden referans döndüren bir operasyon yer almaktadır; GetBestRootAsync. Bu dönüş tipi nedeniyle ilgili metod çağrısı awaitable’ dır. Dolayısıyla async ile işaretlenmiş bir metod içerisindeyken await ile çağırılabilir. Dilerseniz bu durumu test etmeye çalışacak şekilde arayüzümüzü geliştirmeye devam edelim. Bu amaçla, WPF(Windows Presentation Foundation) uygulamamızda yer alanMainWindow öğesinin XAML(eXtensible Application Markup Language) içeriğini aşağıdaki gibi düzenleyelim.


<Window x:Class="WpfClientApp.MainWindow" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Title="MainWindow" Height="250" Width="460"> 
    <Grid> 
        <Grid.RowDefinitions> 
            <RowDefinition Height="auto"/> 
            <RowDefinition Height="*"/> 
            <RowDefinition Height="auto"/> 
        </Grid.RowDefinitions> 
        <StackPanel Orientation="Horizontal" Grid.Row="0"> 
            <Button x:Name="btnGetRoot" Content="En iyi yol bilgisini getir" 
                    HorizontalAlignment="Left" Margin="2,2,2,2" Click="btnGetRoot_Click_1"/> 
            <Label Content="Yana Birşeyler Yaz"/> 
            <TextBox Margin="3,3,3,3" Width="228"/> 
        </StackPanel> 
        <Label x:Name="lblStatus" Grid.Row="2" Content="Durum bilgisi"/> 
        <DataGrid x:Name="grdRoots" Grid.Row="1" ItemsSource="{Binding}"AutoGenerateColumns="False"> 
            <DataGrid.Columns> 
                <DataGridTextColumn Binding="{Binding Path=RootId}" Header=""/> 
                <DataGridTextColumn Binding="{Binding Path=Title}" Header="Yer"/> 
                <DataGridTextColumn Binding="{Binding Path=Longitude}" Header="Boylam"/> 
                <DataGridTextColumn Binding="{Binding Path=Latitude}" Header="Enlem"/> 
                <DataGridTextColumn Binding="{Binding Path=Altitude}" Header="Deniz Seviyesinden Yükseklik"/> 
            </DataGrid.Columns> 
        </DataGrid>        
    </Grid> 
</Window>

Burada yer alan DataGrid kontrolünün içeriğini, servis üzerinden yapacağımız çağrı sonrası gelenRoot[] referansı ile doldurmaya çalışıyor olacağız. Bu sebepten bir data bind işlemi uyguladık veDataGrid kontrolünün kolonlarında da Root tipine ait özelliklere yer verdik(RootId, Title, Longitude, Latitude ve Altitude) Gelelim yazımızın can alıcı noktasına Sarcastic smile Kod içeriğini aşağıdaki gibi düzenleyelim.

using System.Windows; 
using WpfClientApp.AzonReference;

namespace WpfClientApp 
{ 
    public partial class MainWindow : Window 
    { 
        OptimizationServiceClient proxy = new OptimizationServiceClient();

        public MainWindow() 
        { 
            InitializeComponent(); 
        }

        private async void btnGetRoot_Click_1(object sender, RoutedEventArgs e) 
        { 
            lblStatus.Content = "Bilgiler çekiliyor..."; 
            Root[] roots = await proxy.GetBestRootAsync( 
                new Location { 
                    LocationId = 1 
                    , Title = "Hasanpaşa" 
                } 
                ); 
            grdRoots.DataContext = roots; 
            lblStatus.Content = "Bilgiler çekildi..."; 
        } 
    } 
}

İlk dikkat çekici nokta bntGetRoot_Click_1 olay metodunun async anahtar kelimesi ile işaretlenmiş olmasıdır. Bu işaretleme nedeniyle, ilgili olay metodu içerisinde asenkron yürütülebilecek bir operasyon çağrısı yapılabileceği de belirtilmiş olmaktadır. Nitekim Root[]dizisinin çekilmesi için GetBestRootAsync metoduna yapılan çağrıda, await anahtar kelimesine yer verilmiştir. Olay metodu başında ve veriler DataGrid kontrolüne bağlandıktan sonra da lblStatuskontrolü içerisinde kısa bilgilendirmeler yapılmaktadır.

İşin güzel yanı ise şudur; Asenkron olarak çağırılan servis metodunun işleyişi sırasında, Form, kullanıcı tepkilerine cevap verebilir durumdadır. Yani ekran üzerinde formu başka bir yere sürükleyebilir, içeride yer alan TextBox kontrolünde bir şeyler yazabiliriz Winking smile 

Oysaki eskiden, Dispatcher’ lardan ve hatta daha eskiden de Method Invoker’ lardan yararlanarak ekran arayüzünün cevap verebilir olmasını sağlamaya çalışırdık. Kafa karıştırıcı kodlar ile uğraşmak zorunda kalırdık. Bir kontrol için “hadi neyse…” derken, aynı anda yapılması gereken asenkron çağrı sayısının arttığı durumlarda kod kalabalığı ve karmaşıklığını daha da fazlalaştırıdık. Aslında uygulanan yeni model ile basitleşen bu durumu kendi gözlerinizle görmeniz daha iyi olacaktır. Ben sadece bir ekran görüntüsünü koyabilebileceğim. Siz mutlaka örnek kodu indirim test etmeye çalışın.


Görüldüğü üzere async ve await anahtar kelimelerinden de yararlandığımız bu senaryoda, kod daha az karmaşık olmakla beraber, istemci arayüzünün de asenkron işleyiş sırasında cevap verebilir olması sağlanmıştır. WCF operasyonlarının Windows Phone 8(Şu adresteki tartışmaya da bir kulak verin) gibi cevap verebilir arayüz ihtiyaçları yüksek olan uygulama çeşitlerinde de kullanıldığı düşünüldüğünde, kazanılan kabiliyetin önemli olduğu aşikardır. Böylece geldik kısa bir yazımızın daha sonuna. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.

Yazar Hakkında

Burak Selim Şenyurt

Burak Selim Şenyurt

buraksenyurt.com

Yıldız Teknik Üniversitesi Matematik Mühendisliği mezunu olan Şenyurt, 1999 yılında profesyonel olarak adım attığı yazılım dünyasında, 2003 yılından beri Microsoft .Net teknolojileri ile ilgilenmektedir. Yazılım hayatına Assist Line isimli Call Center firmasında Delphi programcısı olarak başlayan Şenyurt sonrasında, sırasıyla Bizitek(Junior Developer), Netron(Master Trainer), Citibank(Outsource Senior Software Developer), Innova(Application Development Consultant), ve TCM(Software Architect) firmalarında görev almıştır. Su anda ING Bank bünyesinde Kıdemli Yazılım Danışmanı olarak görev yapmaktadir. 2006, 2007 yıllarında C#, 2008,2009,2010 yıllarında ise Connected System Developer kategorisinde Microsoft MVP seçilen Şenyurt, evli ve 1 çocuk babasıdır. C# diline olan düşkünlüğü, oğluna S(h)arp adının verilmesinde önemli bir etken olmustur.

Sosyal Medya

ORANLAR

  • 8129izleme

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...
  • Merhaba, ellerinize sağlık çok yardımcı ol...
  • Merhaba Bu uygulama örneğinden ASP.net ...
  • Hocam Link başka sayfaya yönlendiriyor.
  • merhaba benim merak ettiğim bir konu var y...

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

  • 122279
  • 0
Hakan Keskin

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

17.12.2013

  • 68588
  • 0
batuhan avlayan

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

02.09.2013

  • 50136
  • 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İŞİ