Bilmek istediğin her şeye ulaş

C#'ta çok kanallı olarak çalışan bir programı durdurmanın ve sonra istenildiğinde kaldığı yerden devam ettirmenin en uygun ve güvenilir yöntemi nedir?

C#'ta ya da başka bir çok-kanallı programlamayı destekleyen programda bir kanalı belli bir süre durdurmanın en güvenli yolu bunu threadin kendisinin yapmasıdır. Eğer kanal (Thread) bilinen tanımlı bir süre devam edecekse bunu Thread.sleep ile yapılması uygundur. Eğer kanal'ın kaldığı yerden devam etmesi kendi dışındaki bir olaya bağlıysa semaphore ile kendi içinde kanal kilitlenmeli ve diğer olay bu semaphore'u serbest bırakmalıdır. Semaphore kavramı kolay görünür ama bir kanalı kitleyebileceği için aslında önemli ve zordur. Üstünde biraz çalışılması gerekir ama burada denileni yapmanın en doğru yoludur. msdn.microsoft.com/tr-tr/library/system... (v=vs. 110) . aspx
  • Paylaş
3

Unluckypod, öncelikle cevap için teşekkürler. yapmak istediğim şey main thread dışındaki bütün kanalları bir buton tetiklemesiyle önce durdurmak sonra belli bir zaman sonra yine buton tetiklemesiyle çalışmasına kaldığı yerden devam etmesini sağlamak.

Unluckypod, dipnot: task sınıfı yardımıyla yaptığımızı varsayalım bütün multithread işlemlerini.

Unluckypod, dipnot:kanallar birbirine bağlı değil. yani bir sıraya vs tabii değil. veya veri alışverişi de yok kendi aralarında.

Çok Kanallı (Multi Threading) çalışan bir uygulama takdir edersiniz ki her bir kanal ana akıştan bağımsız olarak bir iş yapar. Genellikle bu yapılan iş ana akışa bir geri dönüş sağlamaz. Bir state i değiştirmeye çalışır yada verilen (void) dönüşlü bir hizmeti tamamlamaya çalışır.
Bahsi geçen senaryonuzda yapılması gereken şey her kanal sonsuz şekilde çalışması gerekmektedir yani while(true) diyerek çalıştırılmalıdır. While içinde gezinen imleç her adımda bir field ı güncellemeli dir. Örneğin step1 , step2 iki gibi değerler set etmeli dir. Bir button tetiklendiğinde ilgili fieldların değerleri butona basıldıkdan sonraki step i tutmalıdır. Bu fieldların değerleride fiziksel olarak disk e kayıt edilmelidir. Örneğin SQLite gibi bir DB olabilir veya başka bir şey. Yeniden tetik gönderildiğinde bu fieldların değerleri okuyarak her bir Thread kaldığı noktadan hayatına devam edebilir.
  • Paylaş
3

Unluckypod, Bazı sorularım olacak. Aptalca olursa kusura bakmayın.
-Öncelikle program, task sınıflarını kullanarak, main thread dışında her birini task lerin başlattığı 101 kanaldan oluşuyor. Bu yüz kanalı tetikleyen 1 tane ana tetikleyici kanal var. Her kanal otomatik olarak ardışık sınıfları ve sınıflarda ki metodları tetikliyor ve bütün işlerini bitirince de wait ile main thread den önce bitmeyi bekliyor. Bu işlemler sırasında devamlı döngüler kullanılıyor ve devamlı veritabanı ekleme ve okuma işlemleri gerçekleşiyor.İstediğim zaman cancel etmek için bazı yerlere token.IsCancellationRequested if kontrol yapısı bulunmakta.
-Şimdi benim anladığım diyorsunuz ki, programı cancel edin önceden bahsettiğim if kontrol yapısında, token.ThrowIfCancellationRequested() dan önce, bütün gerekli değişken verilerini ve database de en son eklenen verilerle ilgili verileri database de sakla sonra bunları program tekrar açıldığında, oku ve kullan. Bahsettiğiniz eğer buysa, peki ben en son cancel edilen noktadan itibaren database de kaydettiğim veriler ışığında, nasıl programa kaldığı yerden devam edecem.Hiç bir fikrim yok.

dediğim gibi umarım saçma bi soru sormamışımdır.

Aykut Çalışkan, Sorunuz kesinlikle saçma değil. Açıklamanızda bahis ettiğim mesele anlaşılmış diye görüyorum sadece ufak bir kısım kalmış.
" peki ben en son cancel edilen noktadan itibaren database de kaydettiğim veriler ışığında, nasıl programa kaldığı yerden devam edecem."

Cevaben.
1.
While(true){...} olarak çalışan bir function sürekli olarak çalışmaktadır. siz Thread ı öldürmediğiniz sürece ki burada benim anlatmaya çalıştığım konu tam burada dır. Thread ı öldürmüyorsunuz. sadece Suspend ediyorsunuz. While dönmeye devam edecek siz nereden itibaren işyapmaya yeniden başlayacağınıza kara vereceksiniz.
2.
Thread ı öldürdüğünüz durumda ise Thread in içinde çalışan Function a bir state parametresi geçirebilirsiniz.

Unluckypod, sanırım anladım. Bunu uygulamaya çalışayım bakim. tekrar teşekkürler değerli bilgiler için...

Sonraki Soru
HESAP OLUŞTUR

İstatistikler

252 Görüntülenme3 Takipçi2 Yanıt