• 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

Workflow Foundation 4.0 - Custom Async Activity Geliştirmek [Beta 2]

Hatırlayacağınız üzere bir önceki blog yazımızda Workflow Foundation 4.0 üzerinde özel aktiviteleri nasıl geliştirebileceğimizi incelemeye başlamış ve bu anlamda ilk olarak CodeActivity türevli bir bileşen üretmiştik. Workflow Foundation 4.0 ile gelen önemli yeniliklerden biriside asenkron aktivite bileşenlerini içeriyor olmasıdır.

01.01.2013

Yazar: Burak Selim Şenyurt (Google+)

Kategori: C#.Net

4173

Merhaba Arkadaşlar,

Hatırlayacağınız üzere bir önceki blog yazımızda Workflow Foundation 4.0 üzerinde özel aktiviteleri nasıl geliştirebileceğimizi incelemeye başlamış ve bu anlamda ilk olarak CodeActivity<T> türevli bir bileşen üretmiştik. Workflow Foundation 4.0 ile gelen önemli yeniliklerden biriside asenkron aktivite bileşenlerini içeriyor olmasıdır. Özellikle .Net Framework 4.0 tarafında üzerinde ağırlıklı olarak durulmaya başlanan paralel programlamanın da bir sonucu olan bu durum karşısında, geliştiricilerin asenkron olarak çalışabilen aktivite bileşenleri yazması pek tabidir.

Asenkron aktivitelerde iki temel operasyon bulunmaktadır. Bu operasyonlardan birisi asenkron olarak çalışacak işlerin başlatıcısı iken, diğerde tamamlandığında devreye girecek olanıdır. Bunlara ilaveten opsiyonel olarak asenkron işlemin iptal edilebilmesi için gerekli operasyonda eklenebilir.

Bu operasyonları içeren asenkron aktiviteleri geliştirmek için AsyncCodeActivity<T> tipinden türetme(Inherit) yapmak yeterlidir.

Dilerseniz hiç vakit kaybetmeden basit bir örnek üzerinden devam edelim. Bu amaçla bir önceki projemizde yer alan aktivite kütüphanemize BulkMailActivity isimli yeni bir Code Activity öğesi ekleyelim. Bu bileşen toplu olarak mail gönderme işlemlerini üstlenecektir. Gerçektende sürecin içerisinde bir noktada yer alabilen toplu mail gönderme adımının, sürecin kalan kısmını duraksatmaması istenebilir. Böyle bir vakada asenkron olarak mail gönderme işlemini üstelenecek bir aktivite çok yararlı olacaktır. BulkMailActivity isimli bileşenimizin sınıf diagramı görüntüsü ve kod içeriği ise aşağıdaki gibidir.

using System;
using System.Activities;
using System.Collections.Generic;
using System.Net.Mail;

namespace ActivityLibrary2
{
    public sealed class BulkMailActivity
        : AsyncCodeActivity<bool>
    {
        public InArgument<string[]> MailList{ get; set; }
        public InArgument<string> MailBody { get; set; }
        public InArgument<string> MailSubject { get; set; }

        private SmtpClient smtp;

        public BulkMailActivity()
        {
            smtp = new SmtpClient("localhost");
        }

        protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
        {
            MailMessage message = new MailMessage
            {                
                  Body=MailBody.Get(context),
                   Subject=MailSubject.Get(context),
                   From=new MailAddress("admin@wf4.com")
            };
            message.To.Add(String.Join(",", MailList.Get(context)));

            Func<MailMessage, bool> SendDelegate = new Func<MailMessage, bool>(Send);
            context.UserState = SendDelegate;
            return SendDelegate.BeginInvoke(message, callback, state);
        }

        protected override bool EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
        {
            Func<MailMessage, bool> SendDelegate = (Func<MailMessage, bool>)context.UserState;
            return SendDelegate.EndInvoke(result);
        }

        bool Send(MailMessage message)
        {
            smtp.Send(message);
            return true;
        }
    }
}

Dikkat edileceği üzere AsyncCodeActivity<T> türetmesinden dolayı BeginExecute ve EndExecute isimli iki metodun ezilmesi(override) gerekmektedir. BeginExecute metodu içerisinde ise Func<T,TResult> tipinden bir temsilci(delegate) kullanılarak asenkron olarak yürütülecek metodun işaret edilmesi sağlanmaktadır. Çok doğal olarak asenkron kodlamada ana fikir, temsilcilerin(delegate) üzerinden çağırılan BeginInvoke ve EndInvoke metodlarıdır. Func temsilcisi sayesinde parametre ve geri dönüş tipi belli olan metodun işaret edilerek kullanılabilmesi sağlanmaktadır. Func temsilcisinin bu örnekte kullanılan versiyonuna göre ilk parametre in tipindendir ve Send metoduna gönderilebilecek olan parametreyi belirtmektedir. İkinci generic parametre ise out tipinden olup, Send metodundan döndürülecek olan tipi belirtmektedir. Dikkat edilmesi gereken noktalardan bir diğeride, BeginExecute ve EndExecute metodları arasında veri paylaşımının nasıl yapıldığıdır.

Yukarıdaki şekil sanıyorum ki bu konuda bir fikir vermektedir. Her iki metodda AsyncCodeActivityContext tipinden bir parametre almaktadır. BeginExecute metodunda bu parametrenin UserState özelliğine SendDelegate isimli Func<MailMessage,bool> temsilci örneği atanmıştır. Buna göre EndExecute metodu içerisinde SendDelegate referansının yakalanması ve çok doğal olarak EndInvoke metodunun çağırılabilmesi mümkündür. Aktivitemiz dışarıdan mail listesini, mail gövdesini ve konu kısımlarını almaktadır ki çok daha fazla parametre alabilir.(Size önerim MailMessage tipinin alabileceği tüm özellikleri içerecek bir mail gönderme aktivite bileşenini geliştirmeye çalışmanızdır) Gönderme işlemi sırasında makine üzerindeki varsayılan SMTP tipi sunucusu kullanılır. Bu nedenle örneğin kendi bilgisayarınızda çalışması sırasında mail gönderme işleminin gerçekleşmemesi mümkündür. Sealed 

Gelelim test kısmına. Bu amaçla TestScene.xaml içeriğini aşağıdaki gibi değiştirelim.

Görüldüğü üzere bileşenimizin ilgili özelliklerine bazı test verileri aktarılmıştır. MailList özelliği aslında bir String dizisi olduğundan değer ataması yapılırken süslü parantezli bir yazım stili kullanılmalıdır. Bunun dışında mail gönderme bileşeni sonuç olarak bool bir değer üretmektedir. Bu değer SendResult isimli aktivite bazındaki argümana atanmaktadır.

Xaml kısmı(Sadece bir kısmı verilmiştir);

 <x:Members>
    <x:Property Name="SendResult" Type="InArgument(x:Boolean)" />
  </x:Members>
  <mva:VisualBasic.Settings>Assembly references and imported namespaces serialized as XML namespaces</mva:VisualBasic.Settings>
  <Sequence sad:XamlDebuggerXmlReader.FileName="C:\Documents and Settings\bsenyurt\my documents\visual studio 10\Projects\ActivityLibrary2\ActivityLibrary2\TestScene.xaml" sap:VirtualizedContainerService.HintSize="222,200">
    <Sequence.Variables>
      <Variable x:TypeArguments="sd1:DataTable" Name="QueryResult" />
    </Sequence.Variables>
    <sap:WorkflowViewStateService.ViewState>
      <scg3:Dictionary x:TypeArguments="x:String, x:Object">
        <x:Boolean x:Key="IsExpanded">True</x:Boolean>
      </scg3:Dictionary>
    </sap:WorkflowViewStateService.ViewState>
    <local:BulkMailActivity sap:VirtualizedContainerService.HintSize="200,22" MailBody="Deneme mailidir" MailList="[{&quot;birmailadresi@bimail.com&quot;, &quot;ikincimailadresi@bimail.com&quot;}]" MailSubject="Konu Yok" Result="[SendResult]" />
  </Sequence>

Tabiki bu örnekte sadece async tipinden bir code activity bileşeninin nasıl geliştirilebileceği ele alınmıştır. Aslında ilave edilmesi gereken ek özelliklerde yok değildir. Söz gelimi mail gönderme işlemi sırasında oluşabilecek istisnalar(Exception) sonrasında nasıl davranılacaktır. Bunun için bir Exception Handling mekanizmasının kullanılması, bir başka deyişle try...catch bloklarına başvurulması gerekebilir. Diğer yandan mailleri virgül ile ayırıp toplu şekilde göndermek yerine tek tek gönderilmesi yolu da tercih edilebilir. Nitekim şu durumda, herhangibir maile yapılan gönderi sırasında oluşacak istisna sonrası kalan gönderme işlemleride icra edilmeyecektir. Sözün özü gerçek hayat senaryolarında bu tip bir bileşenin çok daha titiz yazılması şarttır. Bizim bu yazı için odaklanmamız gereken noktalar ise şunlardır;

  • Asenkron aktivite bileşenleri geliştirmek için AsyncCodeActivity<T> tipinden türetme yapılır.
  • Türetme sonrası BeginExecute ve EndExecute metodları ezilir.
  • İstenirse iptal işlemlerinin ele alınabilmesi amacıyla Cancel metoduda ezilebilir.
  • Asenkron olarak çalışacak işin doğasında BeginInvoke veya EndInvoke kabiliyetleri yoksa Func gibi temsilcilerden yararlanılabilir.
  • BeginExecute ve EndExecute metodları arasında veri taşınması gerektiğinde, ortak parametre olan AsyncCodeActivityContext tipinden yararlanılır. Örneğimizdeki gibi illede temsilcinin taşınmasına gerek yoktur. Söz konusu parametre ortak olarak kullanılacak bir referansın taşınması istendiğinde değerlendirilmelidir.
  • Çalışma zamanı, Workflow içerisinde bir asenkron bileşen ile karşılaştığında bunu yürütmeye başlar ve hemen sonraki adımdan işleyişine devam eder.

Böylece geldik bir yazımızın daha sonuna. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.

ActivityLibrary2Async.rar (54,25 kb)

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

  • 4173izleme

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

  • 124032
  • 0
Hakan Keskin

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

17.12.2013

  • 71194
  • 0
batuhan avlayan

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

02.09.2013

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