27 Mayıs 2010 Perşembe

Thread - BackgorundWorker - 3

Tekrar merhaba,

Threadlerle ilgili yazmaya başladığımızda BackgroundWorker( BW demek istiyorum..) hakkında bahsetmeye başlamıştık ve biraz geniş konuolduğu içinde buralara kadar geldik sanırım bir kaç örnek daha vermek lazım..
Toplarlamak açısından önceden bahsettiğim bazı kavramlara açıklık getirmek ve son bir küçük kod parçacığı vererek BW konusundan çıkmak istiyorum... başlayalımmı ?

Daha önce bahsettiğim kavramlar

Control.Invoke -> Birden fazla thread çalışırken, başka bir işlem olan form elementleriyle iletişimde kullanılıyor. Eğer kontrolü(Method) invoke ile kullanmazsak
Cross-thread operation not valid: Control '...' accessed from a thread other than the thread it was created on.
hatasıya karşılaşırız...

Dispatcher.Invoke -> Control.Invoke ile aynı işi WPF için yapar.

Gelelim BW ile ilgili diğer noktalara ;

çalıştırmak için 2 işlemi gerçekleştirmek yeterli olabiliyor
1- bir adet bw nesnesi örneği olşturumak ->
static BackgroundWorker bw = new BackgroundWorker();
ve
dowork olayını kullanmak ->
bw.DoWork += bw_DoWork;

static void bw_DoWork (object sender, DoWorkEventArgs e) {
Console.WriteLine (e.Argument);
}
2- RunWorkerAsync metodunu opsiyonel olarak bir object parametresiyle çağırmak.

Benim tavsiyem ise yapılacak işe göre hazrılanmış bir BW nin altsınıfını oluşturmak ve bunu kullanmak.
BW sealed bir sınıf olmadığından ve virtual OnDoWork sunduğundan bu mümkün ve olay tabanlı asenkron çalışma modeline bir örnek teşkil edebilir.
msdn library
Şöyleki ;

public class Client {
public FinancialWorker GetFinancialTotalsBackground (int foo, int bar) {
return new FinancialWorker (foo, bar);
}
}
public class FinancialWorker : BackgroundWorker {
public Dictionary Result;
public volatile int Foo, Bar;

public FinancialWorker() {
WorkerReportsProgress = true;
WorkerSupportsCancellation = true;
}

public FinancialWorker (int foo, int bar) : this() {
this.Foo = foo; this.Bar = bar;
}

protected override void OnDoWork (DoWorkEventArgs e) {
ReportProgress (0, "Çalışıyorum ..");

while (!finished report ) {
if (CancellationPending) {
e.Cancel = true; // iptal gerekliyse bırakalım...
return;
}
Perform another calculation step
ReportProgress (percentCompleteCalc, "buradayım...");
}

ReportProgress (100, "Gerçekleştirildi!");
e.Result = Result = completed report data;
}
}

Sanırım daha faz BW ile ilgili konuşmaya gerek yok. Gördüğünüz üzere İptal Tamamlandı İşlem durumu özellikleri de mevcut..

daha sonra görüşmek üzere
başarılar..
KANPINAR

Hiç yorum yok: