Kadang-kadang pengguna memulai operasi teknis tambahan yang membutuhkan waktu untuk dijalankan. Dalam kasus ini, biasanya baik untuk menampilkan semacam progress bar, bersama dengan informasi tentang tugas yang sedang dijalankan saat ini.
Untuk menghindari kopling erat antara UI dan lapisan logika, biasanya yang terbaik adalah membuat komunikasi terjadi melalui beberapa jenis proxy. Artinya, back-end tidak boleh memanipulasi elemen UI sendiri, atau bahkan berinteraksi dengan lapisan perantara secara langsung.
Jelas, harus ada beberapa panggilan balik di suatu tempat untuk membuat pekerjaan ini. Saya biasanya menerapkannya dalam satu dari dua cara:
Berikan objek yang dapat diubah ke back-end, dan mintalah back-end untuk mengubahnya pada progres. Objek memberi tahu front-end ketika perubahan terjadi.
Lewati fungsi panggil balik formulir
void f(ProgressObject)
atauProgressObject -> unit
yang dipanggil kembali . Dalam hal ini, back-end membangunProgressObject
dan itu benar-benar pasif. Saya pikir itu harus membangun objek baru setiap kali ingin melaporkan kemajuan.
Apa kekurangan dan kelebihan dari metode ini? Apakah ada metode terbaik yang disepakati untuk digunakan? Apakah ada keadaan yang berbeda untuk penggunaannya?
Apakah ada teknik pelaporan kemajuan yang sama sekali berbeda yang saya abaikan?
sumber
BackgroundWorker
RH itu menyebutkan. Dibungkus dalam kelas khusus bersama dengan "formulir kemajuan", dll. Dan mekanisme sederhana untuk mengkomunikasikan pengecualian - sebagaimanaBackgroundWorker
desain berjalan di utas terpisah. Sejauh kita menggunakan fitur-fiturnya dengan cara yang disarankan oleh .Net maka itu bisa dikatakan idiomatis. Dan dalam konteks bahasa / kerangka kerja tertentu "idiomatik" mungkin yang terbaik.Jawaban:
Sulit untuk menyeimbangkan efisiensi jika backend memberi tahu dalam hal ini. Tanpa peduli Anda mungkin menemukan bahwa peningkatan kemajuan Anda berakhir dengan menggandakan atau tiga kali lipat waktu yang dibutuhkan untuk menyelesaikan operasi jika Anda bertujuan untuk pembaruan kemajuan yang sangat lancar.
Saya tidak mendapatkan perbedaan di sini begitu banyak.
Polling dari front-end di utas terpisah dengan penambahan atom di backend. Polling masuk akal di sini karena ini untuk operasi yang selesai dalam periode yang terbatas dan kemungkinan ujung mengambil perubahan negara tinggi, terutama jika Anda bertujuan untuk progress bar halus seperti sutra. Anda dapat mempertimbangkan variabel kondisi jika Anda tidak menyukai gagasan polling dari thread frontend, tetapi dalam hal ini Anda mungkin ingin menghindari memberi tahu setiap kenaikan progress bar granular tunggal.
sumber
Inilah perbedaan antara mekanisme pemberitahuan push dan pull .
Objek yang dapat diubah ( tarikan ) perlu disurvei berulang kali oleh UI dan disinkronkan jika Anda mengharapkan tugas back-end akan dieksekusi di latar belakang / utas pekerja.
Callback ( push ) hanya akan membuat UI berfungsi ketika ada sesuatu yang benar-benar berubah. Banyak kerangka kerja UI juga memiliki invokeOnUIThread callable dari utas pekerja untuk membuat sepotong kode dijalankan pada utas UI sehingga Anda benar-benar dapat membuat perubahan tanpa menginjak bahaya yang terkait dengan utas. (pun intended)
Secara umum pemberitahuan push lebih disukai karena mereka hanya membuat pekerjaan ketika pekerjaan perlu dilakukan.
sumber
The mutable object (the pull) will need to be repeatably polled by the UI and synchronized if you expect the back-end task to be executed in a background/worker thread.
- Tidak jika objek yang dapat diubah adalah dialog itu sendiri, atau antarmuka yang berfungsi untuk itu. Tentu saja, itu sama dengan panggilan balik.Saya menggunakan soket web dengan AngularJS. Ketika ujung depan menerima pesan, itu menampilkannya di area pesan yang ditunjuk yang memudar menjadi kosong setelah beberapa detik. Di bagian belakang saya hanya memposting pesan status ke antrian pesan. Saya hanya mengirim teks, tetapi tidak ada alasan saya tidak bisa mengirim objek status dengan nilai-nilai seperti persentase selesai atau kecepatan transfer.
sumber
Anda menyebutkan "dua cara" Anda seolah-olah itu adalah konsep yang terpisah tetapi saya ingin sedikit mendorongnya.
Anda telah mengatakan bahwa Anda ingin menghindari kopling-dekat UI dan logika, jadi saya dapat dengan aman berasumsi bahwa "objek yang dapat diubah" yang Anda lewati ini sebenarnya adalah implementasi dari antarmuka tertentu yang didefinisikan dalam modul logika. Dengan demikian, ini hanyalah cara lain untuk mengirimkan panggilan balik ke proses yang secara berkala disebut dengan informasi tentang kemajuan.
Adapun manfaat dan kelemahan ...
Kelemahan untuk metode (1) adalah kelas yang mengimplementasikan antarmuka hanya dapat melakukannya sekali. (Jika Anda ingin melakukan pekerjaan yang berbeda dengan doa yang berbeda, Anda akan memerlukan pernyataan pergantian atau pola pengunjung.) Dengan metode (2), objek yang sama dapat menggunakan panggilan balik yang berbeda untuk setiap doa kode backend tanpa memerlukan beralih.
Kekuatan untuk metode (1) adalah bahwa jauh lebih mudah untuk memiliki beberapa metode pada antarmuka daripada berurusan dengan beberapa metode callback (2) atau panggilan balik tunggal dengan pernyataan switch untuk beberapa konteks.
sumber
Teknik yang dapat Anda gunakan mungkin sangat sulit.
Saya mencoba mencari tahu dengan skenario yang berbeda
Permintaan login sederhana ke db (berarti merespons dari db dengan satu elemt) tidak memerlukan laporan kemajuan tetapi selalu dapat mengaktifkan utas UI di tugas yang berbeda ex. async atau backgroundworker, di sini Anda hanya perlu satu panggilan balik untuk hasil.
Tetapi bagaimana jika Anda meminta untuk melihat semua inventaris Anda dengan item 1mln? Query ini harus selesai beberapa menit, jadi dalam hal ini Anda perlu mengimplementasikan kemajuan perport Anda dalam logika bisnis Anda dalam item form / item, maka Anda dapat memperbarui UI Anda dan dapat diberikan opsi untuk membatalkan panggilan balik.
Kasus yang sama untuk pengunduhan file. Anda selalu dapat menerapkan di sini panggilan balik kemajuan Anda dalam bentuk byte byte, dan menahan semua kontrol komunikasi melalui http adalah pola yang sangat umum.
Pada pendekatan pribadi saya, saya menerapkan logika kemajuan bisnis saya hanya untuk klien saya, menghindari untuk berbagi objek lain dengan titik akhir.
sumber