Saya telah memeriksa beberapa timer yang mungkin akhir-akhir ini, dan System.Threading.Timer
dan System.Timers.Timer
orang-orang yang terlihat perlu bagi saya (karena mereka mendukung pengumpulan benang).
Saya membuat game, dan saya berencana menggunakan semua jenis acara, dengan interval yang berbeda, dll.
Mana yang terbaik?
Threading.Timer
's artikel MSDN , itu benar-benar benang-aman ...System.Threading.Timer
"Ironisnya" tidak seamanSystem.Threading.Thread
benang dan benang diperoleh melalui kolam. Hanya karena kelas-kelas ini tidak berpegangan tangan Anda dan mengelola penggunaanlock
kata kunci itu sendiri tidak berarti kelas-kelas ini tidak threadsafe. Anda mungkin juga mengatakanSystem.Threading.Thread
ini bukan threadsafe, karena itu persis sama benar.SynchronizingObject
tidak membuat objek timer itu sendiri thread-safe. Itu hanya memastikan bahwa kode Anda untuk menangani event timer dipanggil dalam utas tertentu (jika Anda menyetel properti itu dengan tepat). Objek timer itu sendiri tetap tidak dijamin aman, seperti yang dinyatakan dengan jelas dalam dokumentasi. Di sisi lain,System.Threading.Timer
objek secara khusus didokumentasikan sebagai thread-safe.System.Threading.Timer
adalah timer biasa. Itu memanggil Anda kembali pada utas pool (dari pool pekerja).System.Timers.Timer
adalahSystem.ComponentModel.Component
yang membungkus aSystem.Threading.Timer
, dan menyediakan beberapa fitur tambahan yang digunakan untuk pengiriman pada utas tertentu.System.Windows.Forms.Timer
alih-alih membungkus pesan asli -saja-HWND dan menggunakan Window Timers untuk meningkatkan peristiwa dalam loop pesan HWND itu.Jika aplikasi Anda tidak memiliki UI, dan Anda ingin .Net timer yang paling ringan dan serba guna mungkin, (karena Anda senang mengetahui threading / pengiriman Anda sendiri) maka
System.Threading.Timer
sama baiknya dengan yang ada dalam kerangka kerja.Saya tidak sepenuhnya jelas apa yang seharusnya 'tidak aman' dengan masalah
System.Threading.Timer
. Mungkin sama seperti yang ditanyakan dalam pertanyaan ini: Thread-safety System.Timers.Timer vs System.Threading.Timer , atau mungkin semua orang hanya berarti bahwa:mudah untuk menulis kondisi lomba saat Anda menggunakan timer. Misalnya lihat pertanyaan ini: Pengatur waktu (System.Threading) pengaman ulir
re-entrancy pemberitahuan timer, di mana event timer Anda dapat memicu dan memanggil Anda kembali untuk kedua kalinya sebelum Anda selesai memproses acara pertama . Misalnya lihat pertanyaan ini: Eksekusi aman-thread menggunakan System.Threading.Timer dan Monitor
sumber
System.Timers.Timer
menggunakanSystem.Threading.Timer
internal. Lihat kode sumber .Dalam bukunya " CLR Via C # ", Jeff Ritcher tidak suka menggunakan
System.Timers.Timer
, timer ini berasal dariSystem.ComponentModel.Component
, memungkinkan untuk digunakan dalam permukaan desain Visual Studio. Sehingga itu hanya akan berguna jika Anda ingin timer pada permukaan desain.Dia lebih suka menggunakan
System.Threading.Timer
untuk tugas-tugas latar belakang pada thread pool thread.sumber
System.Threading.Timer
mirip dengan menggunakan kumpulan utas atau membuat utas Anda sendiri. Tentu saja kelas-kelas ini tidak menangani sinkronisasi untuk Anda - itu tugas Anda! Baik thread pool thread, thread Anda sendiri, atau callback timer tidak akan menangani penguncian - pada objek apa dan dalam mode apa dan dalam keadaan apa Anda perlu mengunci membutuhkan penilaian yang baik dan versi threading dari timer memberi Anda fleksibilitas dan rincianInformasi dari Microsoft tentang ini (lihat Keterangan di MSDN ):
Sangat menarik untuk menyebutkan bahwa
System.Timers.Timer
sudah usang dengan .NET Core 1.0, tetapi diimplementasikan lagi dalam .NET Core 2.0 (/ .NET Standard 2.0). Tujuan dengan .NET Standard 2.0 adalah semudah mungkin untuk beralih dari .NET Framework yang mungkin merupakan alasan mengapa ia kembali.Ketika sudah tidak digunakan lagi, .NET Portability Analyzer Visual Studio Add-in direkomendasikan untuk digunakan
System.Threading.Timer
sebagai gantinya.Sepertinya itu nikmat Microsoft
System.Threading.Timer
sebelumnyaSystem.Timers.Timer
.EDIT NOTE 2018-11-15: Saya ingin mengubah jawaban saya karena informasi lama tentang .NET Core 1.0 sudah tidak berlaku lagi.
sumber
Satu perbedaan penting yang tidak disebutkan di atas yang mungkin membuat Anda keluar adalah
System.Timers.Timer
diam - diam menelan pengecualian, sedangkanSystem.Threading.Timer
tidak.Sebagai contoh:
vs.
sumber
Saya menemukan perbandingan singkat dari MSDN
sumber
Kedua kelas secara fungsional setara, kecuali yang
System.Timers.Timer
memiliki opsi untuk memanggil semua panggilan balik kadaluwarsa waktunya melalui ISynchronizeInvoke dengan mengatur SynchronizingObject . Jika tidak, kedua timer akan memanggil callback kadaluarsa pada utas pool thread.Saat Anda menyeret
System.Timers.Timer
ke permukaan desain Formulir Windows, Visual Studio menetapkan SinkronisasiObjek ke objek formulir, yang menyebabkan semua panggilan balik kedaluwarsa dipanggil pada utas UI.sumber
Dari MSDN:
System.Threading.Timer
adalah penghitung waktu yang sederhana dan ringan yang menggunakan metode panggilan balik dan dilayani oleh utas utas. Tidak disarankan untuk digunakan dengan Formulir Windows, karena panggilan baliknya tidak terjadi pada utas antarmuka pengguna.System.Windows.Forms.Timer
adalah pilihan yang lebih baik untuk digunakan dengan Formulir Windows. Untuk fungsionalitas penghitung waktu berbasis server, Anda dapat mempertimbangkan untuk menggunakanSystem.Timers.Timer
, yang memunculkan peristiwa dan memiliki fitur tambahan.Sumber
sumber