Tentang kelas timer di C# Ada tiga kelas timer di C#
1. Tentukan di System.Windows.Forms
2. Ditentukan dalam kelas System.Threading.Timer
3. Ditentukan dalam kelas System.Timers.Timer
System.Windows.Forms.Timer diterapkan ke WinForm, diimplementasikan melalui mekanisme pesan Windows, mirip dengan kontrol Timer di VB atau Delphi, dan diimplementasikan secara internal menggunakan API SetTimer. Kelemahan utamanya adalah waktunya tidak tepat dan harus ada loop pesan, yang tidak tersedia untuk Aplikasi Konsol.
System.Timers.Timer sangat mirip dengan System.Threading.Timer, mereka diimplementasikan melalui .NET Thread Pool, ringan, waktu yang akurat, dan tidak ada persyaratan khusus untuk aplikasi dan pesan. System.Timers.Timer juga dapat diterapkan ke WinForm, sepenuhnya menggantikan kontrol Timer di atas. Kerugiannya adalah mereka tidak mendukung drag-and-drop langsung dan memerlukan pengkodean manual.
Contoh:
Menggunakan kelas System.Timers.Timer
System.Timers.Timer t = System.Timers.Timer baru (10000); Buat instance kelas Timer dan atur interval menjadi 10.000 milidetik.
t.Elapsed += system.Timers.ElapsedEventHandler(theout); Jalankan peristiwa saat waktu tercapai;
t.AutoReset = benar; Atur apakah akan mengeksekusi sekali (false) atau sepanjang waktu (true);
t.Enabled = benar; apakah akan menjalankan peristiwa System.Timers.Timer.Elapsed;
public void theout(sumber objek, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show("OK!");
}
Analisis eksperimental tentang persamaan dan perbedaan antara penggunaan tiga pengatur waktu dalam C#
http://dotnet.chinaitlab.com/CSharp/737740.html
Ada tiga jenis pengatur waktu yang tersedia di C#:
1. Pengatur waktu standar berbasis Windows (System.Windows.Forms.Timer)
2. Pengatur waktu berbasis server (System.Timers.Timer)
3. Timer Threading (System.Threading.Timer)
Mari kita bahas beberapa eksperimen kecil untuk menganalisis persamaan dan perbedaan antara tiga pengatur waktu, terutama bagian terkait utas.
Tangkapan layar contoh eksperimental:
1. Timer berbasis Windows standar (System.Windows.Forms.Timer)
Hal pertama yang perlu diperhatikan adalah bahwa Windows Timer dirancang untuk lingkungan berutas tunggal
Pengatur waktu ini telah hadir dalam produk sejak Visual Basic versi 1.0 dan sebagian besar tetap tidak berubah
Timer ini adalah yang paling mudah digunakan, cukup seret kontrol Timer dari toolbox ke formulir, dan atur properti seperti peristiwa dan interval
Hasil percobaan juga sepenuhnya konsisten dengan karakteristik thread tunggal:
1. Saat timer ini dimulai, ID utas anak akan ditampilkan dalam daftar ID utas anak di bawah ini, dan sama dengan ID utas utama
private void formsTimer_Tick(pengirim objek, EventArgs e)
{
i++;
lblSubThread.Text += "Eksekusi Subthread, ID Utas:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
}
2. Ketika utas utama dijeda selama 5 detik, utas turunan akan menjeda eksekusi, dan ketika utas turunan yang sebelumnya ditangguhkan tidak akan dieksekusi setelah 5 detik, utas turunan berikutnya akan langsung dieksekusi (yaitu, itu akan menghasilkan beberapa baris nilai).
Sistem.Threading.Thread.Sleep(5000);
3. Menjeda peristiwa proses anak selama 5 detik akan menyebabkan jendela utama menjadi tidak responsif selama 5 detik
4. Tentukan variabel statis utas:
[BenangStatis]
int statis pribadi i = 0;
Tambahkan satu ke setiap peristiwa subutas, lalu klik nilai variabel statis utas untuk mendapatkan nilai i yang ditingkatkan
2. Pengatur waktu berbasis server (System.Timers.Timer)
System.Timers.Timer tidak bergantung pada formulir, mengaktifkan utas dari kumpulan utas, dan merupakan versi terbaru dari pengatur waktu tradisional yang dioptimalkan untuk berjalan di lingkungan server
Tidak ada kontrol out-of-the-box yang disediakan dalam kotak alat VS2005 dan perlu dikodekan secara manual untuk menggunakan timer ini
Ada dua cara untuk menggunakannya,
1. Lampirkan ke formulir melalui properti SynchronizingObject
System.Timers.Timer timersTimer = new System.Timers.Timer();
timersTimer.Enabled = false;
timersTimer.Interval = 100;
timersTimer.Elapsed += system.Timers.ElapsedEventHandler(timersTimer_Elapsed);
timersTimer.SynchronizingObject = ini;
Dengan cara ini, eksperimen bekerja hampir sama dengan timer berbasis Windows standar, kecuali bahwa pada eksperimen kedua di atas, meskipun eksekusi subthread juga akan dijeda, tetapi setelah 5 detik semua tugas yang diantrekan sebelumnya akan dijalankan (yaitu beberapa baris nilai tidak akan hilang).
2. Jangan gunakan properti SynchronizingObject
Metode ini multi-threaded, yaitu thread anak awal dan formulir utama tidak berada di thread yang sama. Namun, ada juga masalah: karena subthread adalah utas terpisah, kontrol dalam formulir tidak dapat diakses, tetapi hanya dapat diakses melalui proxy:
delegate void SetTextCallback(string text);
Sumber: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Turn) Perbandingan tiga objek timer di blog C#_dash_Sina
。
。
void timersTimer_Elapsed(pengirim objek, System.Timers.ElapsedEventArgs e)
{
//使用代理
string text = "eksekusi utas turunan, ID utas:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = SetTextCallback baru(SetText);
ini. Invoke(d, objek baru[] { teks });
i++;
}
void pribadi SetText(teks string)
{
lblSubThread.Text += teks;
}
Dengan cara ini, kita akan mendapatkan hasil berikut dari percobaan lagi:
1. Saat timer ini dimulai, ID utas anak akan ditampilkan dalam daftar ID utas anak di bawah ini, dan berbeda dari ID utas utama
2. Saat Anda mengklik utas utama untuk menjeda selama 5 detik, sub-utas akan terus dieksekusi (mungkin tidak terlihat di antarmuka, tetapi dapat dengan mudah dilihat dengan mengeluarkan file di sub-utas)
3. Menjeda peristiwa proses anak selama 5 detik tidak akan menyebabkan jendela utama menjadi tidak responsif
4. Tambahkan satu ke variabel statis utas setiap kali dalam peristiwa sub-utas, lalu klik apakah variabel statis utas bernilai 0 atau 0 (tidak akan mengubah variabel statis utas di jendela utama).
3. Timer Threading (System.Threading.Timer)
Pengatur waktu utas juga tidak bergantung pada formulir, adalah pengatur waktu sederhana dan ringan yang menggunakan metode panggilan balik alih-alih menggunakan peristiwa, dan didukung oleh utas kumpulan utas.
Pengatur waktu utas berguna dalam skenario di mana pesan tidak dikirim pada utas.
Berikut cara menggunakannya:
System.Threading.Timer threadTimer;
public void ThreadMethod(Status objek)
{
//使用代理
string text = "eksekusi utas turunan, ID utas:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = SetTextCallback baru(SetText);
ini. Invoke(d, objek baru[] { teks });
i++;
}
void pribadi Form1_Load(pengirim objek, EventArgs e)
{
threadTimer = system.Threading.Timer baru(System.Threading.TimerCallback baru(ThreadMethod), null, -1, -1);
}
Kode Jeda:
threadTimer.Change(-1, -1);
Efek percobaan sama dengan cara kedua dari timer berbasis server (System.Timers.Timer),
Tentu saja, metode dan prinsip penggunaan spesifik berbeda, yang terpenting adalah metode ini menggunakan metode agen alih-alih metode peristiwa, dan dapat dieksekusi secara terpisah tanpa mengandalkan bentuk dan komponen
Berikut ini adalah tabel yang dirangkum oleh orang asing (perbedaan antara ketiga metode tersebut):
Fitur deskripsi{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
Dukungan untuk menambahkan dan menghapus pendengar setelah timer dibuat. Ya Tidak Ya
Mendukung panggilan balik pada utas antarmuka pengguna Ya Tidak Ya
Panggilan kembali dari utas yang diperoleh dari kumpulan utas Ya Ya Tidak
Mendukung seret dan lepas di Windows Forms Designer Ya Tidak Ya
Cocok untuk berjalan di lingkungan multi-threaded server Ya Ya Tidak
Termasuk dukungan untuk meneruskan status arbitrer dari inisialisasi timer ke callback. Tidak Ya Tidak
Mengimplementasikan IDisposable Ya Ya Ya
Mendukung panggilan balik satu kali serta panggilan balik berulang secara berkala Ya Ya Ya Ya
Dapat diakses di seluruh batas domain aplikasi Ya Ya Ya Ya
Mendukung IComponent – hostable dalam IContainer Ya Tidak Ya |