Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 18870|Yanıt: 1

[Kaynak] C# üç zamanlayıcı uygulaması

[Bağlantıyı kopyala]
Yayınlandı 12.10.2017 13:12:51 | | |
C#'daki zamanlayıcı sınıfı hakkında C#'da üç zamanlayıcı sınıfı vardır

1. System.Windows.Forms içinde tanımla

2. System.Threading.Timer sınıfında tanımlanmıştır

3. System.Timers.Timer sınıfında tanımlanmıştır



System.Windows.Forms.Timer, WinForm'a uygulanır, Windows mesaj mekanizması üzerinden uygulanır; bu mekanizma VB veya Delphi'deki Timer kontrolüne benzer şekilde uygulanır ve API SetTimer kullanılarak dahili olarak uygulanır. En büyük dezavantajı, zamanlamanın kesin olmaması ve bir mesaj döngüsü olması gerektiğidir; bu döngü konsol uygulamasında mevcut değildir.



System.Timers.Timer, System.Threading.Timer'a çok benzer; .NET Thread Pool üzerinden uygulanır, hafif, doğru zamanlama sağlar ve uygulamalar ile mesajlar için özel bir gereksinim yoktur. System.Timers.Timer ayrıca WinForm'a da uygulanabilir ve yukarıdaki Zamanlayıcı kontrolünü tamamen değiştirir. Dezavantajları ise doğrudan sürükle-bırak özelliğini desteklememeleri ve manuel kodlama gerektirmeleri.



Örnek:

System.Timers.Timer sınıfını kullanın

System.Timers.Timer t = yeni System.Timers.Timer(10000); Zamanlayıcı sınıfını başlatın ve aralığı 10.000 milisaniyeye ayarlayın.

t.Elapsed += yeni System.Timers.ElapsedEventHandler(theout); Zamana ulaştığında olayları gerçekleştirir;

t.AutoReset = doğru; Bir kez (yanlış) veya her zaman (doğru) mı çalıştırılacağını ayarlayın;

t.Enabled = doğru; System.Timers.Timer.Elapsed olayını çalıştırıp çalıştırılmadığını;



public void theout(object source, System.Timers.ElapsedEventArgs e)

{

MessageBox.Show("Tamam!");

}



C#'da üç zamanlayıcı kullanımı arasındaki benzerlikler ve farklılıkların deneysel analizi

http://dotnet.chinaitlab.com/CSharp/737740.html



C#'da üç tür zamanlayıcı mevcuttur:


1. Windows tabanlı standart zamanlayıcı (System.Windows.Forms.Timer)


2. Sunucu tabanlı zamanlayıcı (System.Timers.Timer)


3. İş Parçalanma Zamanlayıcısı (System.Threading.Timer)

Üç zamanlayıcı arasındaki benzerlikleri ve farkları, özellikle iplikle ilgili kısmı analiz etmek için bazı küçük deneylerden geçelim.

Deneysel örnek ekran görüntüsü:



1. Standart Windows tabanlı zamanlayıcı (System.Windows.Forms.Timer)



İlk not edilmesi gereken şey, Windows Zamanlayıcı'nın tek iş parçacıklı ortamlar için tasarlandığıdır



Bu zamanlayıcı, Visual Basic sürümü 1.0'dan beri üründe bulunmakta ve büyük ölçüde değişmeden kalmıştır



Bu zamanlayıcı kullanımı en kolay olanıdır, sadece Zamanlayıcı kontrolünü araç kutusundan forma sürükle ve olaylar ile aralıklar gibi özellikleri ayarlayın



Deneysel sonuçlar ayrıca tek iplikli bağlantının özellikleriyle tamamen uyumludur:



1. Bu zamanlayıcı başlatıldığında, alt iş parçacığı kimliği aşağıdaki alt iş parçacığı ID listesinde gösterilecek ve ana iş parçacığı kimliğiyle aynıdır



private void formsTimer_Tick(object sender, EventArgs e)



{



i++;



lblSubThread.Text += "Alt İş Parçacığı Yürütme, İş Parçacığı Kimliği:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



}









2. Ana iş parçacığı 5 saniye duraklatıldığında, alt iş parçacığı yürütmeyi duraklatır ve daha önce askıya alınan alt iş parçacığı 5 saniye sonra çalıştırılmadığında, sonraki alt iş parçacığı doğrudan çalıştırılır (yani, birkaç satır değer çıkarır).



System.Threading.Thread.Sleep(5000);



3. Bir çocuk sürecin olaylarını 5 saniye durdurmak, ana pencerenin 5 saniye boyunca yanıt vermemesine neden olur



4. Bir iş parçacığı statik değişkeni tanımlayın:



[ThreadStatic]



özel statik int i = 0;



Her alt iş parçacağı olayına bir tane ekleyin ve ardından i değerini almak için thread statik değişken değerine tıklayın



2. Sunucu tabanlı zamanlayıcı (System.Timers.Timer)



System.Timers.Timer formlara bağımlı değildir, iş parçacığı havuzundan iş parçacıklarını uyandırır ve sunucu ortamında çalışmak üzere optimize edilmiş geleneksel zamanlayıcının güncellenmiş bir versiyonudur



VS2005 araç kutusunda kutudan çıkmış bir kontrol yoktur ve bu zamanlayıcıyı kullanmak için manuel olarak kodlanması gerekir



Onu kullanmanın iki yolu vardır,



1. SynchronizingObject özelliğiyle forma bağlanın



System.Timers.Timer timersTimer = yeni System.Timers.Timer();



timersTimer.Enabled = yanlış;



timersTimer.Aralık = 100;



timersTimer.Elapsed += yeni System.Timers.ElapsedEventHandler(timersTimer_Elapsed);



timersTimer.SynchronizingObject = bu;



Bu şekilde, deney standart Windows tabanlı zamanlayıcı gibi çalışır, ancak yukarıdaki ikinci deneyde alt iş parçacığının yürütülmesi de duraksa, ancak 5 saniye sonra daha önce sıraya alınan tüm görevler yürütülür (yani birkaç satır değer eksik olmaz).



2. SynchronizingObject özelliğini kullanmayın



Bu yöntem çok iş parçacıklıdır, yani başlangıç alt iş parçacığı ile ana form aynı iş parçacığında değildir. Ancak bir sorun da vardır: alt iş parçacığı ayrı bir iş parçacığı olduğundan, formdaki kontrollere erişilemiyor, sadece bir proxy üzerinden erişilebiliyor:



delegate void SetTextCallback(string text);



Kaynak: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Turn) C#_dash_Sina blogunda üç zamanlayıcı nesnesinin karşılaştırılması









void timersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)



{



//使用代理



string text = "child thread yürütme, iş parçacığı ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



SetTextCallback d = yeni SetTextCallback(SetText);



Bu. Çağırmak(d, yeni nesne[] { metin });



i++;



}



private void SetText(string text)



{



lblSubThread.Text += metin;



}



Bu şekilde, deneyden tekrar aşağıdaki sonuçları alacağız:



1. Bu zamanlayıcı başlatıldığında, alt iş parçacığı kimliği aşağıdaki alt iş parçacığı ID listesinde gösterilir ve ana iş parçacığı ID'sinden farklıdır







2. Ana iş parçacığına tıklayıp 5 saniye durakladığınızda, alt iş parçacığı çalışmaya devam eder (arayüzde görünmeyebilir ama dosyayı alt iş dizisinde çıkararak kolayca görülebilir)



3. Bir çocuk sürecin olaylarını 5 saniye durdurmak, ana pencerenin tepkisiz kalmasına neden olmaz



4. Alt iş parçacığı olayında her seferinde iş parçacığı statik değişkenine bir tane ekleyin ve ardından iş parçacığı statik değişkeninin 0 mı 0 mı değerinde olduğunu tıklayın (ana pencerede iş parçacığı statik değişkenini değiştirmez).



3. İş Parçalanma Zamanlayıcısı (System.Threading.Timer)



İş parçacığı zamanlayıcıları formlara dayanmaz, olaylar yerine geri çağırma yöntemleri kullanan basit ve hafif zamanlayıcılardır ve iş parçacığı havuzu iş parçacıklarıyla beslenirler.



İş parçacığı zamanlayıcıları, mesajların iş parçacıklarında gönderilmediği durumlarda faydalıdır.



İşte nasıl kullanılacağı:



System.Threading.Timer threadTimer;



public void ThreadMethod(Object state)



{



//使用代理



string text = "child thread yürütme, iş parçacığı ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



SetTextCallback d = yeni SetTextCallback(SetText);



Bu. Çağırmak(d, yeni nesne[] { metin });



i++;



}



private void Form1_Load(object sender, EventArgs e)



{



threadTimer = yeni System.Threading.Timer (yeni System.Threading.TimerCallback(ThreadMethod), null, -1, -1);



}



Duraklatma Kodu:



threadTimer.Change(-1, -1);



Deneyin etkisi, sunucu tabanlı zamanlayıcının ikinci yöntemiyle (System.Timers.Timer) aynıdır,



Elbette, özel kullanım yöntemleri ve ilkeleri farklıdır, en önemlisi bu yöntemin olay yöntemi yerine ajan yöntemini kullanmasıdır ve form ile bileşenlere bağlı olmadan ayrı ayrı yürütülebilir



Aşağıda, yabancılar tarafından özetlenmiş bir tablo yer almaktadır (üç yöntem arasındaki fark):



Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer



Zamanlayıcı oluşturulduktan sonra dinleyici ekleme ve çıkarma desteği. Evet hayır evet



Kullanıcı arayüzü başlığında geri çağrıları destekler Evet Hayır Evet



İş parçacığı havuzundan alınan iş parçacıklarından geri çağrılar Evet Evet Hayır



Windows Forms Designer'da sürükle-bırak işlemini destekler Evet Yok Evet



Çok iş parçacıklı sunucu ortamında çalışmak için uygundur Evet Evet Hayır



Zamanlayıcı başlatmadan geri çağrıya rastgele durumun geçirilmesini destekler. Hayır evet hayır



IDisposable Implements Evet Evet



Tek seferlik geri dönüşleri ve periyodik tekrarlayan geri dönüşleri destekler Evet Evet Evet



Uygulama alanı sınırları arasında erişilebilir Evet Evet



IComponent'i destekliyor – IContainer'da barındırılabilir Yes No Yes




Önceki:c# Lamda ifade kümesi degrup minimum değeri almak için
Önümüzdeki:Linq: Setin boş olmadığını belirlemek için asla Count() > 0 kullanma
Yayınlandı 8.11.2017 14:02:44 |
Doğru. Gerçekten çok iyi, ama neden gönderiye cevap vermedin?
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com