Kısa Sınav - 6

Veritabanındaki Stored Procedure‘ları çalıştırabilmek üzere bir Data Access Layer (DAL) tasarlıyorsunuz. Açtığınız SqlConnection‘ların kapatıldığından emin olmak için Try-Catch‘lerin Finally bloklarına uygun kodları yazıyorsunuz. Uygulamayı çalıştırdığınızda SqlConnection‘ın kapatılacağı satırda NullReferenceException üretiliyor ve program hata verip, kapanıyor.

Ne yapmanız lazım?

  • Eğer SqlConnection nesnesi null ise InvalidOperationException fırlatılmalı
  • Önce SqlConnection nesnesinin durumuna bakmalı, eğer açık durumda ise kapatılmalı
  • Kapatma kodundan önce, SqlConnection nesnesinin null’dan farklı olduğu kontrol edilmeli
  • Finally bloğunda yer alan SqlConnection‘ı kapatma kodu Try-Catch bloğuna alınmalı

Sorunun doğru cevabı için;

Doğru cevap; “Önce SqlConnection nesnesinin durumuna bakmalı, eğer açık durumda ise kapatılmalı”

SqlConnection nesnesini kapatmaya çalışmadan önce, hala açık olup-olmadığı kontrol edilmelidir.

TPL (Task Parallel Library) - Task Class

.Net 4.0 ile birlikte gelecek güzel class’lardan bir tanesi de Task class’ı.

Task class’ı ve TPL (Task Parallel Library) ile birlikte gelen diğer class’lar sayesinde paralel programlama .net framework ile desteklenir hale geliyor.

TPL_Task_1

Yandaki görselde görebileceğiniz gibi, TPL (Task Parallel Library) ve PLINQ (Parallel LINQ) .Net Framework 4.0 ile gelen en önemli özellikler.

Paralel programlamanın performans’a katkısını MSDN’de yer alan şu iki makale’de okuyabilirsiniz;

Parallel Programming in .Net Framework

Parallel Performance

Gene MSDN’de yer alan şu sayfalardan da .net 4 ile gelecek yeni yapıları öğrenebilirsiniz;

Data Structures for Parallel Programming

Task Parallelism (Task Parallel Library)

Introduction to Tasks

Task class’ını kullanarak, Thread yönetme maliyetlerinden kurtularak kolaylıkla Multi-Core uyumlu, Asenkron çalışabilen kodlar yazabiliriz.

Task class’ından yeni bir örnek oluşturmak için;

Aşağıdaki gibi yeni bir instance oluşturup, daha sonra Start method’u ile başlatabiliriz.

Task t0 = new Task(() => MessageBox.Show(“Task Örneği 1”) ); t0.Start();</pre> Veya, aşağıdaki kodda yazdığım gibi, Task class’ının singleton static Factory property’sinin StartNew method’u ile hem tanımlayıp, aynı anda başlatabiliriz.

Task t1 = Task.Factory.StartNew(() =>
{
    string Mesaj = "Birinci çalışacak..";
    MessageBox.Show(Mesaj);
});

Örneğini oluşturduğumuz Task nesnesi, başlatılana kadar hafızada bekler. Başlatıldığında, ayrı bir thread’de çalışacağından dolayı, uzun süren işlerin arayüz’ü kilitlemesini önlemek için kullanılabilir.

Birden Fazla Task’ın peşpeşe çalışması sağlanabilir;

Task t2 = Task.Factory.StartNew(() =>
{
    MessageBox.Show("Birinci çalışacak..");
}).ContinueWith((t) =>
{
    MessageBox.Show("İkinci çalışacak..");
}).ContinueWith((t) =>
{
    MessageBox.Show("Üçüncü çalışacak..");
});

Veya birden fazla Task’ın aynı anda çalışması da sağlanabilir;

Task t3 = Task.Factory.StartNew(() =>
{
    Task c1 = Task.Factory.StartNew(() =>
    {
        MessageBox.Show("Aynı anda çalışacak..");
    }, TaskCreationOptions.AttachedToParent);

    Task c2 = Task.Factory.StartNew(() =>
    {
        MessageBox.Show("Aynı anda çalışacak..");
    }, TaskCreationOptions.AttachedToParent);
});

*TaskCreationOptions* parametresine verdiğimiz *AttachedToParent* değerine dikkat!.. Bu sayede c1 ve c2 Task'ları t3 Task'ının **Child Task**'ları haline geldi, t3 Task'ı da **Parent Task** oldu.

Kısa Sınav - 5

Aşağıdaki kod bloğunun çıktısı ne olur?

int sayi = 126; MessageBox.Show((sayi % 10).ToString());

Seçenekler;

  • 10
  • 6
  • 12.6
  • 126
  • 1260 Sorunun doğru cevabı için;

Doğru cevap, 6.

% operatörü, matematik’teki mod alma işlemine karşılık geliyor.

126 sayısının 10’lu sistemde modunu aldığımızda (10’a bölüp, kalan’ı aldığımızda) 6 elde ederiz.

ClickOnce ve ApplicationDeployment class'ı

Kısa Sınav - 3 yazımda belirttiğim gibi, ClickOnce ile deploy ettiğiniz uygulamalarda, güncellemeleri programatik olarak kontrol etmek için ApplicationDeployment class’ını kullanırız.

Bu yazımda, ApplicationDeployment class’ının kullanımını anlatmaya çalışacağım.

Öncelikle bilinmesi gereken, ApplicationDeployment class’ından yeni bir instance oluşturamazsınız. Çünkü public bir constructor’ı yoktur.

KisaSinav3_1

ApplicationDeployment class’ından yeni bir örnek oluşturmak için, gene ApplicationDeployment class’ının static ve singleton CurrentDeployment property’sini kullanırız.

KisaSinav3_2

Artık elimizde bir değişken olduğuna göre, bu değişkeni kullanarak uygulamamızda güncelleme olup-olmadığını sorgulayabiliriz.

Bunun için kullanabileceğimiz fonksiyonlar;

KisaSinav3_3

CheckForUpdate()

Uygulamanın yeni versiyonu olup-olmadığını kontrol eder, geriye bool tipinde değer döner.

CheckForUpdateAsync()

CheckForUpdate() fonksiyonu ile aynı işi yapar, fakat asenkron çalışabilir.

Versiyon kontrolü tamamlandığında CheckForUpdateCompleted event’i otomatik olarak çağırılır.

CheckForDetailedUpdate()

Uygulamanın yeni versiyonu olup-olmadığını kontrol eder, geriye UpdateCheckInfo tipinde değer döner.

KisaSinav3_4

Genelde CheckForDetailedUpdate() fonksiyonunu çağırmakta fayda vardır. Çünkü, daha güncel versiyonun çıktığını bulduğumuzda, kullanıcıya mesaj vermek isteyeceğiz. Mesaja yazacağımız detaylı bilgiye UpdateCheckInfo class’ı aracılığıyla ulaşabiliriz. Bu bilgiyi bize CheckForDetailedUpdate() fonksiyonu döndürüyor.

UpdateCheckInfo class’ının member’ları;

AvailableVersion

Uygulamanın güncellenebilir son versiyonunun versiyon bilgisi. (Version tipinde değer döner)

IsUpdateRequired

Uygulamanın ClickOnce ile deploy’u sırasında “UpdateRequired” seçeneğinin seçilip seçilmediğinin bilgisi. (bool tipinde değer döner) Eğer true değer içeriyorsa, kullanıcıya mesaj verilmeli, çalışan uygulaman kapatılmalı ve güncelleme yapılmalıdır.

MinimumRequiredVersion

Kullanıcıda bulunması gerekli minimum versiyon bilgisi. (Version tipinde değer döner)

UpdateAvailable

Kullanıcıda çalışan uygulamadan daha güncel bir versiyonun bulunup bulunmadığı bilgisi. (bool tipinde değer döner)

UpdateSizeBytes

Güncellenecek dosyaların toplam boyutu bilgisi. (long tipinde değer döner)

Kısa Sınav - 4

Aşağıdaki dizi tanımlamalarından hangisinde hata yoktur?

int[] dizi; dizi = {0, 2, 4, 6};</pre>

int[] dizi = {"0", "2", "4", "6"};
int[] dizi = new int["7"];
int[] dizi = new int[];
int[] dizi = new int[5];

Sorunun doğru cevabı için;

İlk kod hatalıdır.

int[] dizi;
dizi = {0, 2, 4, 6};

Çünkü, atama yapılacak dizilerin önce tanımı yapılıp, sonra değer ataması yapılamaz.

İkinci kod'da hatalı, çünkü tip uyumsuzluğu var. (int ve string)

Üçüncü kod'da hatalı, çünkü dizi boyutu ancak rakamsal olarak verilebilir.

Dördüncü kod'da da hata var, çünkü, dizi oluşturulurken boyutu verilmelidir.

Beşinci kod'da ise hata yoktur.

Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı