Microsoft-ui-xaml: Proposal: Properti pengiriman otomatis mengubah acara ke Utas UI

Dibuat pada 17 Mei 2019  ·  3Komentar  ·  Sumber: microsoft/microsoft-ui-xaml

Ringkasan

Izinkan pengikatan UI terjadi dari properti yang memunculkan perubahan notifikasi dari Utas non-UI apa pun

Alasan

Saat Anda mengikat properti, Anda harus selalu memunculkan pemberitahuan perubahan properti di UI Thread, atau Anda akan mendapatkan pengecualian runtime. Ini menyebabkan UI mengalir ke model dan model tampilan Anda, sehingga Anda dapat menaikkan utas yang tepat, yang pada gilirannya mencegah Anda menggunakan INPC dari perpustakaan .NET Standard (kecuali jika Anda ingin masuk ke bait'n'switch) .

Selain itu, Anda mungkin memiliki properti yang berubah beberapa kali selama satu bingkai, sehingga Anda berpotensi melompat ke Utas UI lebih banyak daripada yang benar-benar dibutuhkan (yang diperlukan hanyalah menandai properti sebagai "kotor", dan diambil di render pass berikutnya.

Semua ini menyebabkan kompleksitas kode ekstra yang signifikan dan lebih rentan terhadap kesalahan.

Ini juga menyebabkan masalah di WinUI 3.0, karena kami sekarang memiliki dua Utas UI: UWP Legacy, dan utas WinUI: Yang mana yang harus saya angkat?

Cakupan

  • Harus dapat meningkatkan INotifyPropertyChanged dan INotifyCollectionChanged di utas apa pun
  • Harus dapat melakukannya dengan murah beberapa kali menjadi bingkai, tetapi hanya memicu satu pembaruan (yang terakhir dalam kemenangan)
  • Harus dapat menangani properti yang sedang disetel saat sedang dibaca untuk memperbarui UI.
  • Menghindari beralih ke UI Thread jika sudah ada di dalamnya.

Catatan penting

Masalah threading tentu saja valid, tetapi saya tidak percaya ini benar-benar masalah pada akhirnya. Tidak masalah bahwa beberapa peristiwa INPC diaktifkan sebelum pembaruan UI, karena hanya yang terakhir yang penting. Ini tidak akan berbeda dengan pengalihan kode yang ada ke Utas UI beberapa kali. Setelah yang pertama beralih ke Utas UI, properti sudah bisa diperbarui berkali-kali, dan dengan demikian yang terakhir menang.
Tentu saja perlu ada kunci pendek ketika nilai dibaca yang mencegah flag kotor disetel, jadi putaran kedua pembaruan UI terjadi pada bingkai berikutnya, jika properti diperbarui pada saat yang sama sedang dibaca.
Bahkan jika nilai misalnya berubah dari salah, menjadi benar, dan kembali ke salah, Properti Ketergantungan sudah cukup pintar untuk mendeteksi bahwa nilainya tidak berubah, dan dapat mengoptimalkan dengan tidak menyebabkan kelulusan rendering baru karena properti tidak berubah.

feature proposal team-Markup

Komentar yang paling membantu

Ini adalah masalah yang sangat valid, terima kasih telah mengangkatnya. Dukungan afinitas utas untuk DP dalam kerangka kerja mungkin bukan masalah besar, tetapi mungkin sangat baik bagi pelaksana INPC.

Jika beberapa kode dapat memunculkan perubahan properti dari utas non-UI, itu juga berarti bahwa kode pendukung properti dapat diubah dari utas latar belakang. Ini mungkin dilindungi menggunakan kunci, tetapi pengikatan dua arah kemudian dapat menjadi masalah, karena dapat membuat rantai perubahan properti menjadi buntu.

Ada juga masalah terbesar INPC, adalah kurangnya nilai "saat ini" ketika acara diangkat. Ada situasi di mana properti tidak disinkronkan dengan benar, (misalnya SelectedIndex dan ItemsSource tidak diperbarui secara sinkron dan SelectedIndex kehilangan nilainya), atau dengan ping-pong perubahan yang disebabkan oleh status properti (misalnya perubahan TextBox dan filter regex).

Ini kemudian membawa masalah dengan INCC, di mana seluruh koleksi perlu dilindungi dengan baik. Misalnya, Anda dapat mengangkat acara yang merujuk pada item yang telah dipindahkan, atau tidak ada lagi.

Saya tidak mengatakan tidak ada solusi untuk masalah ini (pasti ada) tetapi pendengar IPNC mengubah afinitas threading tidak cukup untuk membuat masalah ini mudah di kedua ujung antarmuka.

Semua 3 komentar

Ini adalah masalah yang sangat valid, terima kasih telah mengangkatnya. Dukungan afinitas utas untuk DP dalam kerangka kerja mungkin bukan masalah besar, tetapi mungkin sangat baik bagi pelaksana INPC.

Jika beberapa kode dapat memunculkan perubahan properti dari utas non-UI, itu juga berarti bahwa kode pendukung properti dapat diubah dari utas latar belakang. Ini mungkin dilindungi menggunakan kunci, tetapi pengikatan dua arah kemudian dapat menjadi masalah, karena dapat membuat rantai perubahan properti menjadi buntu.

Ada juga masalah terbesar INPC, adalah kurangnya nilai "saat ini" ketika acara diangkat. Ada situasi di mana properti tidak disinkronkan dengan benar, (misalnya SelectedIndex dan ItemsSource tidak diperbarui secara sinkron dan SelectedIndex kehilangan nilainya), atau dengan ping-pong perubahan yang disebabkan oleh status properti (misalnya perubahan TextBox dan filter regex).

Ini kemudian membawa masalah dengan INCC, di mana seluruh koleksi perlu dilindungi dengan baik. Misalnya, Anda dapat mengangkat acara yang merujuk pada item yang telah dipindahkan, atau tidak ada lagi.

Saya tidak mengatakan tidak ada solusi untuk masalah ini (pasti ada) tetapi pendengar IPNC mengubah afinitas threading tidak cukup untuk membuat masalah ini mudah di kedua ujung antarmuka.

WPF sudah mengetahuinya jadi mungkin tarik saja solusinya dari sana?

Saran yang bagus. Kami melakukan ini untuk acara CollectionChanged (agak tidak sengaja ...), kami harus dapat melakukan hal yang sama untuk NotifyPropertyChanged.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat