Pengatur waktu yang andal dalam aplikasi konsol

103

Saya menyadari bahwa di .NET ada tiga jenis pengatur waktu (lihat Membandingkan Kelas Pengatur Waktu di Perpustakaan Kelas .NET Framework ). Saya telah memilih pengatur waktu berulir karena jenis lain dapat melayang jika utas utama sibuk, dan saya perlu ini agar dapat diandalkan.

Cara kerja pengatur waktu ini dalam pengontrolan pengatur waktu diletakkan di utas lain sehingga selalu dapat berdetak seiring dengan pekerjaan yang mulai diselesaikan di utas induk saat tidak sibuk.

Masalah dengan pengatur waktu ini di aplikasi konsol adalah bahwa sementara pengatur waktu terus berjalan di utas lain, utas utama tidak melakukan apa pun untuk menutup aplikasi.

Saya mencoba menambahkan while trueloop, tetapi utas utama terlalu sibuk ketika timer mati.

John
sumber

Jawaban:

59

Anda dapat menggunakan sesuatu seperti Console.ReadLine()untuk memblokir utas utama, sehingga utas latar belakang lainnya (seperti utas pengatur waktu) akan tetap berfungsi. Anda juga dapat menggunakan AutoResetEvent untuk memblokir eksekusi, kemudian (jika perlu) Anda dapat memanggil metode Set () pada objek AutoResetEvent tersebut untuk melepaskan thread utama. Pastikan juga bahwa referensi Anda ke objek Timer tidak keluar dari ruang lingkup dan sampah dikumpulkan.

huseyint.dll
sumber
20

Pertimbangkan untuk menggunakan ManualResetEvent untuk memblokir thread utama di akhir pemrosesannya, dan memanggilnya Reset()setelah pemrosesan pengatur waktu selesai. Jika ini adalah sesuatu yang perlu dijalankan terus menerus, pertimbangkan untuk memindahkannya ke proses layanan, bukan aplikasi konsol.

Greg Hurlman
sumber