Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 18870|Jawab: 1

[Sumber] C# implementasi tiga timer

[Salin tautan]
Diposting pada 12/10/2017 13.12.51 | | |
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




Mantan:c# Lamda expression set degrouping untuk mengambil nilai minimum
Depan:Catatan: Jangan pernah menggunakan Count() > 0 untuk menentukan bahwa set tidak kosong
Diposting pada 08/11/2017 14.02.44 |
Itu benar. Ini sangat bagus, tetapi mengapa Anda tidak membalas postingan itu?
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com