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 |