20 Mayıs 2010 Perşembe

backgroundWorker devam....

Bugün bahsetmeye başladığım c# ta multi threading e devam etmek istiyorum..
Daha önce verdiğim ( Bölüm -1 ) kodun açıklamasından başlayıp
BackgroundWorker sınıfını bitirmek istiyorum...

!! Bahsettiğim notktalar .net framework 3.5 üzerinde test edildi...

Bir WinForm içerisine toolbox tan sürüklenip bırakılan bir BW üzerinde;

Property kısmına girerek

WorkerReportsProgress
-> Worker birim işlemleri rapor etmelimi?
WorkerSuppertsCancellation -> Birim işlemlerinizi bitmeden iptal etme ihtimaliniz varmı ?

alanlarını "true" olarka seçelim


Events kısmına giderek
DoWork -> operasyon başladığında thread içinde yürütülecek iş tanımı
ProgressChanged -> işlem değiştiğinde, bir kısmı bittiğinde vs. çağrılır
RunWorkerCompleted -> iş tamamlandığında, iptalinde veya durduğunda

alanlarına çift tıklayarak hazırlığımızı bitirelim.

[Serializable]
[ComVisible(true)]
!!!(System.EventArgs is the base class for classes containing event data.)
System.Events sınıfından türetilmiş

DoWorkEventArgs
ProgressChangedEventArgs
RunWorkerCompletedEventArgs

Olay argümanları hemen dikkatimizi çekmiştir.Ve incelemenizi hararetle tavsiye ediyorum.

BW ile işlemlerimizi yürütürken gerçekleşen olaylarla ilgili olarak,
karar vermemizi sağlayacak veriler bu argümanlarla gelen olay dataların içerisinde olacak.

gelelim mini bir örneğe..
!!! thread.sleep(0); !!! thread.sleep(1); ;)
Formun üzerine
iki adet button ve bir progressBar ekledim
1. btn_basla
2. btn_iptal
3. progressBar1 -> min 0 max 100

ve aşağıdaki kodları yazdım ...

private void BW_Test_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i += 1) {
// İptal beklentisi varmı ? durmamam emredildimi ?
if (BW_Test.CancellationPending) {
// İptal Verilmişse thread e dur diyelim
e.Cancel = true;
return;
}
// progres bar gösterebilsin diye değeri gönderelim
BW_Test.ReportProgress(i);
// ilemi gözle görebilmemiz için bekleyelim( iş burada yapılıyor farzediyoruz...)
System.Threading.Thread.Sleep(25);
}
e.Result = 100; }
// yapılan işin yürütülmesinde aşama kaydedildi...progres barı değiştirelim

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
progressBar1.Value = e.ProgressPercentage; }

//ilem tamamlandı veya iptal edildiğinde neler yapılacak
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{ bstate(); }

//işlemi başlatalım ...
private void btn_basla_Click(object sender, EventArgs e)
{
BW_Test.RunWorkerAsync();
bstate();
}

// butonlarımızı worker ın durumuna göre değiştirelim..
// bir worker a tekrar başla demek hataya sebep verir
// BW_Test.IsBusy ile kontrol etmek mümkün ... Cevap verebilirse tabi :D
private void bstate() {
btn_basla.Enabled = !btn_basla.Enabled;
btn_iptal.Enabled = !btn_iptal.Enabled; }

//işlemi iptal etmek istediğimizde nasıl olacak...
private void btn_iptal_Click(object sender, EventArgs e) {
BW_Test.CancelAsync(); }

Bir görev vermenin en kötü tarafı onu takip etmektir...
düsturundan hareketle biraz daha kişisellesştirmek için
kendimize göre geliştirme şansımız var.

Örnek vermek gerekirse ;
Yapılan işlemlerde hatayla karşılaştığınızda
bu durumu nasıl egale edeceğinizi önceden planlamak zorundasınız yoksa kabusunuz olabilir..

İptal Ettiğiniz işlem başka bir işlem(ler) tetikliyor ise bunları kontrol etmlisiniz

Arka planda çalışan işlemlerin program sonlanması halinde nasıl bir tavır sergileyeceği düşünülmeli.

http://msdn.microsoft.com/en-us/library/hkasytyf.aspx
adresini incelemekte fayda görüyorum.
Üzgünüm yeterince türkçe kaynak yok malesef.

Ayrıca geniş çaplı thread işlemleri gerçekleştirmek itiyorsak
işlem durumları ve olası problemleri incelemek için işletim sistemleri konusunu
iyi çalışmış olmanızı umuyorum ;) ilerleyen yazılarda daha gelişmiş uygulama örnekleri
umarım yapabilirim.

görüşmek üzere
KANPINAR







Hiç yorum yok: