Saya perlu mengatur aplikasi yang mengawasi file yang dibuat dalam direktori, baik secara lokal maupun pada drive jaringan.
Apakah FileSystemWatcher
atau polling pada timer akan menjadi pilihan terbaik. Saya telah menggunakan kedua metode di masa lalu, tetapi tidak secara ekstensif.
Masalah apa (kinerja, keandalan, dll.) Yang ada pada kedua metode tersebut?
c#
file-io
filesystemwatcher
distributed-filesystem
Jon Tackabury
sumber
sumber
Jawaban:
Saya telah melihat pengamat sistem file gagal dalam lingkungan produksi dan pengujian. Saya sekarang menganggapnya sebagai kenyamanan, tetapi saya tidak menganggapnya dapat diandalkan. Pola saya adalah untuk melihat perubahan dengan pengamat sistem file, tetapi jajak pendapat sesekali untuk menangkap perubahan file yang hilang.
Sunting: Jika Anda memiliki UI, Anda juga dapat memberi pengguna Anda kemampuan untuk "menyegarkan" untuk perubahan daripada polling. Saya akan menggabungkan ini dengan pengamat sistem file.
sumber
Masalah terbesar yang saya miliki adalah file yang hilang ketika buffer sudah penuh. Mudah dipecahkan - cukup tambahkan buffer. Ingat bahwa itu berisi nama file dan peristiwa, jadi tingkatkan ke jumlah file yang diharapkan (coba-coba). Itu memang menggunakan memori yang tidak dapat dihubungi, sehingga bisa memaksa proses lain ke halaman jika memori semakin rendah.
Berikut ini adalah artikel MSDN pada buffer: FileSystemWatcher .. :: .InternBufferSize Property
Per MSDN:
Kami menggunakan 16MB karena batch besar diharapkan pada satu waktu. Berfungsi dengan baik dan tidak pernah melewatkan file.
Kami juga membaca semua file sebelum mulai memproses bahkan satu ... dapatkan nama file dengan aman di-cache (dalam kasus kami, ke dalam tabel database) kemudian memprosesnya.
Untuk masalah penguncian file, saya menelurkan proses yang menunggu file dibuka kuncinya menunggu satu detik, kemudian dua, kemudian empat, dan sebagainya. Kami tidak pernah polling. Ini telah diproduksi tanpa kesalahan selama sekitar dua tahun.
sumber
The
FileSystemWatcher
juga mungkin kehilangan perubahan selama sibuk kali, jika jumlah perubahan antri meluap buffer disediakan. Ini bukan batasan dari kelas .NET per se, tetapi dari infrastruktur Win32 yang mendasarinya. Dalam pengalaman kami, cara terbaik untuk meminimalkan masalah ini adalah dengan membagikan pemberitahuan secepat mungkin dan menghadapinya di utas lainnya.Seperti disebutkan oleh @ChillTemp di atas, pengamat tidak dapat bekerja pada saham non-Windows. Misalnya, itu tidak akan berfungsi sama sekali pada drive Novell yang terpasang.
Saya setuju bahwa kompromi yang baik adalah melakukan jajak pendapat sesekali untuk mengambil setiap perubahan yang terlewat.
sumber
Perhatikan juga bahwa pengamat sistem file tidak dapat diandalkan pada berbagi file. Terutama jika berbagi file di-host di server non-windows. FSW tidak boleh digunakan untuk hal-hal penting. Atau harus digunakan dengan jajak pendapat sesekali untuk memverifikasi bahwa ia tidak melewatkan apa pun.
sumber
Secara pribadi, saya telah menggunakan
FileSystemWatcher
sistem produksi, dan sudah bekerja dengan baik. Dalam 6 bulan terakhir, itu tidak memiliki cegukan tunggal berjalan 24x7. Ini memantau folder lokal tunggal (yang dibagikan). Kami memiliki sejumlah kecil operasi file yang harus ditangani (10 peristiwa dipecat per hari). Itu bukan sesuatu yang pernah saya khawatirkan. Saya akan menggunakannya lagi jika saya harus membuat kembali keputusan.sumber
Saat ini saya menggunakan
FileSystemWatcher
pada file XML yang diperbarui rata-rata setiap 100 milidetik.Saya telah menemukan bahwa selama
FileSystemWatcher
dikonfigurasi dengan benar Anda seharusnya tidak pernah memiliki masalah dengan file lokal .Saya tidak punya pengalaman tentang menonton file jarak jauh dan berbagi non-Windows.
Saya akan mempertimbangkan polling file menjadi berlebihan dan tidak sebanding dengan biaya overhead kecuali Anda secara inheren tidak mempercayai
FileSystemWatcher
atau secara langsung mengalami keterbatasan semua orang di sini telah terdaftar (saham non-Windows, dan menonton file jarak jauh).sumber
Saya akan pergi dengan polling.
Masalah jaringan menyebabkan
FileSystemWatcher
tidak dapat diandalkan (bahkan ketika overloading peristiwa kesalahan).sumber
Saya mengalami masalah saat menggunakan
FileSystemWatcher
berbagi jaringan. Jika Anda berada di lingkungan Windows murni, itu mungkin tidak menjadi masalah, tapi saya menonton berbagi NFS dan karena NFS tidak memiliki kewarganegaraan, tidak pernah ada pemberitahuan ketika file yang saya tonton berubah.sumber
Saya punya beberapa masalah besar dengan FSW pada drive jaringan: Menghapus file selalu melempar kesalahan, tidak pernah menghapus kejadian. Saya tidak menemukan solusi, jadi saya sekarang menghindari FSW dan menggunakan polling.
Acara penciptaan di sisi lain bekerja dengan baik, jadi jika Anda hanya perlu melihat pembuatan file, Anda dapat menggunakan FSW.
Juga, saya tidak punya masalah sama sekali pada folder lokal, tidak masalah apakah dibagikan atau tidak.
sumber
Kembali dari metode acara secepat mungkin, menggunakan utas lain, menyelesaikan masalah untuk saya:
sumber
Menggunakan FSW dan polling adalah pemborosan waktu dan sumber daya, menurut pendapat saya, dan saya terkejut bahwa pengembang yang berpengalaman menyarankannya. Jika Anda perlu menggunakan polling untuk memeriksa "ada kesalahan FSW", maka Anda dapat, secara alami, membuang FSW sama sekali dan hanya menggunakan polling.
Saya, saat ini, mencoba untuk memutuskan apakah saya akan menggunakan FSW atau polling untuk proyek yang saya kembangkan. Membaca jawabannya, jelas bahwa ada kasus di mana FSW memenuhi kebutuhan dengan sempurna, sementara di lain waktu, Anda perlu polling. Sayangnya, tidak ada jawaban yang benar-benar berurusan dengan perbedaan kinerja (jika ada), hanya dengan masalah "keandalan". Adakah orang yang bisa menjawab bagian pertanyaan itu?
EDIT: nmclean untuk validitas menggunakan FSW dan polling (Anda dapat membaca diskusi di komentar, jika Anda tertarik) tampaknya menjadi penjelasan yang sangat rasional mengapa mungkin ada situasi yang menggunakan FSW dan polling adalah efisien. Terima kasih telah menjelaskan hal itu untuk saya (dan siapa pun yang memiliki pendapat yang sama), nmclean .
sumber
Solusi bekerja untuk bekerja dengan membuat acara alih-alih perubahan
Bahkan untuk menyalin, memotong, menempel, bergerak.
Solusi untuk pengamat file ini saat acara perubahan atribut file menggunakan penyimpanan statis
Ini adalah solusi untuk masalah ini dari berbagai peristiwa pemicu.
sumber
Saya akan mengatakan menggunakan polling, terutama dalam skenario TDD, karena jauh lebih mudah untuk mengejek / mematikan keberadaan file atau sebaliknya ketika acara polling dipicu daripada bergantung pada acara fsw yang lebih "tidak terkontrol". + untuk yang telah bekerja pada sejumlah aplikasi yang diganggu oleh kesalahan fsw.
sumber