Bagikan melalui


BindingOperations.EnableCollectionSynchronization Metode

Definisi

Memungkinkan objek untuk berpartisipasi dalam akses yang disinkronkan CollectionView ke koleksi yang digunakan pada beberapa utas.

Overload

EnableCollectionSynchronization(IEnumerable, Object)

Memungkinkan objek untuk berpartisipasi dalam akses yang disinkronkan CollectionView ke koleksi yang digunakan pada beberapa utas dengan menggunakan mekanisme penguncian sederhana.

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

Memungkinkan objek untuk berpartisipasi dalam akses yang disinkronkan CollectionView ke koleksi yang digunakan pada beberapa utas dengan menggunakan mekanisme selain kunci sederhana.

Keterangan

Aplikasi WPF dapat menampilkan kumpulan data menggunakan ItemsControl atau salah satu subkelasnya (ListBox, DataGrid, , TreeViewListView, dll.). WPF menyalurkan semua aksesnya ke koleksi melalui subkelas CollectionViewItemsControl Baik dan CollectionView memiliki afinitas pada utas tempat ItemsControl dibuat, yang berarti bahwa menggunakannya pada utas yang berbeda dilarang dan melemparkan pengecualian. Akibatnya, pembatasan ini juga berlaku untuk koleksi.

Anda mungkin ingin menggunakan koleksi pada beberapa utas.   Misalnya, Anda ingin memperbarui koleksi (menambahkan atau menghapus item) pada utas "pengumpulan data", sambil menampilkan hasil pada utas "antarmuka pengguna", sehingga UI tetap responsif saat pengumpulan data terjadi. Dalam situasi seperti itu, Anda bertanggung jawab untuk memastikan akses yang disinkronkan ("thread-safe") ke koleksi.   Ini biasanya dilakukan menggunakan mekanisme penguncian sederhana atau mekanisme sinkronisasi yang lebih rumit seperti semaphores, peristiwa reset, dll.

Meskipun Anda harus menyinkronkan akses aplikasi Anda ke koleksi, Anda juga harus menjamin bahwa akses dari WPF (khususnya dari CollectionView) berpartisipasi dalam mekanisme sinkronisasi yang sama.  Anda melakukannya dengan memanggil metode EnableCollectionSynchronizationpada objek.

Untuk menggunakan koleksi pada beberapa utas, salah satunya adalah utas ItemsControlUI yang memiliki , aplikasi memiliki tanggung jawab berikut:

  1. Pilih mekanisme sinkronisasi.

  2. Sinkronkan semua akses dari aplikasi ke koleksi menggunakan mekanisme tersebut.

  3. Panggil EnableCollectionSynchronization untuk menginformasikan WPF tentang mekanisme.

  4. Pastikan bahwa perubahan pada koleksi dan pemberitahuan perubahan tersebut (melalui INotifyCollectionChanged) bersifat atomik; tidak ada akses dari utas lain yang dapat campur tangan.  (Ini biasanya gratis. Misalnya, ObservableCollection<T> menjamin ini, asalkan semua perubahan dilindungi oleh sinkronisasi.)

  5. Jika Anda memanggil DisableCollectionSynchronization, panggilan itu juga harus terjadi pada utas UI.

  6. Jika Anda ingin menggunakan koleksi yang sama pada beberapa utas UI, Anda harus memanggil EnableCollectionSynchronization (dan DisableCollectionSynchronization, jika diperlukan) secara terpisah pada setiap utas UI.

  7. Hindari kebuntuan.  Ini sudah menjadi tanggung jawab aplikasi setelah memilih untuk menggunakan sinkronisasi, tetapi juga harus memperhitungkan partisipasi WPF dalam sinkronisasi, seperti yang dibahas dalam paragraf berikut.

Sebagai imbalannya, WPF menyediakan perilaku berikut:

  • mengakses CollectionView koleksi menggunakan mekanisme sinkronisasi yang diberikan.

  • CollectionView mempertahankan "salinan bayangan" koleksi untuk digunakan pada utas UI.

  • CollectionChanged peristiwa diantrekan saat tiba (di utas apa pun).

  • Peristiwa yang tertunda diterapkan ke salinan bayangan secara asinkron pada utas UI ketika memiliki kesempatan untuk melakukannya.

  • CollectionView tidak akan secara langsung menggunakan mekanisme sinkronisasi lain yang terlihat oleh aplikasi. Ini adalah cara WPF untuk membantu menghindari kebuntuan (lihat item sebelumnya 7).  

Efek bersihnya adalah Anda dapat mengubah koleksi pada utas apa pun, dan perubahan tersebut ItemsControl akhirnya muncul di saat utas UI memiliki waktu untuk "mengejar ketinggalan".  Implementasi telah disetel untuk membatasi laju yang berubah mengalir ke utas UI untuk menjaga utas latar belakang tidak menjenuhkan utas UI dan kelaparan respons terhadap input pengguna normal.

EnableCollectionSynchronization(IEnumerable, Object)

Memungkinkan objek untuk berpartisipasi dalam akses yang disinkronkan CollectionView ke koleksi yang digunakan pada beberapa utas dengan menggunakan mekanisme penguncian sederhana.

public:
 static void EnableCollectionSynchronization(System::Collections::IEnumerable ^ collection, System::Object ^ lockObject);
public static void EnableCollectionSynchronization (System.Collections.IEnumerable collection, object lockObject);
static member EnableCollectionSynchronization : System.Collections.IEnumerable * obj -> unit
Public Shared Sub EnableCollectionSynchronization (collection As IEnumerable, lockObject As Object)

Parameter

collection
IEnumerable

Koleksi yang membutuhkan akses yang disinkronkan.

lockObject
Object

Objek yang akan dikunci saat mengakses koleksi.

Keterangan

Aplikasi WPF dapat menampilkan kumpulan data menggunakan ItemsControl atau salah satu subkelasnya (ListBox, DataGrid, , TreeViewListView, dll.). WPF menyalurkan semua aksesnya ke koleksi melalui subkelas CollectionViewItemsControl Baik dan CollectionView memiliki afinitas pada utas tempat ItemsControl dibuat, yang berarti bahwa menggunakannya pada utas yang berbeda dilarang dan melemparkan pengecualian. Akibatnya, pembatasan ini juga berlaku untuk koleksi.

Anda mungkin ingin menggunakan koleksi pada beberapa utas.   Misalnya, Anda ingin memperbarui koleksi (menambahkan atau menghapus item) pada utas "pengumpulan data", sambil menampilkan hasil pada utas "antarmuka pengguna", sehingga UI tetap responsif saat pengumpulan data terjadi. Dalam situasi seperti itu, Anda bertanggung jawab untuk memastikan akses yang disinkronkan ("aman utas") ke koleksi dan untuk menjamin bahwa akses dari WPF (khususnya dari CollectionView) berpartisipasi dalam mekanisme sinkronisasi yang sama. Dengan memanggil EnableCollectionSynchronization(IEnumerable, Object) metode , Anda dapat melakukan ini dengan menggunakan mekanisme kunci sederhana.

Untuk menggunakan koleksi pada beberapa utas, salah satunya adalah utas ItemsControlUI yang memiliki , Anda harus melakukan hal berikut:

  1. Buat instans objek untuk dikunci saat mengakses koleksi.

  2. Sinkronkan semua akses dari aplikasi ke koleksi dengan mengunci objek tersebut.

  3. Panggil EnableCollectionSynchronization(IEnumerable, Object) untuk memberi tahu WPF bahwa Anda menggunakan mekanisme penguncian sederhana.

    • Panggilan harus terjadi pada utas UI.

    • Panggilan harus terjadi sebelum menggunakan koleksi pada utas yang berbeda atau sebelum melampirkan koleksi ke ItemsControl, mana pun nanti.

  4. Pastikan bahwa perubahan pada koleksi dan pemberitahuan perubahan tersebut (melalui INotifyCollectionChanged) bersifat atomik; tidak ada akses dari utas lain yang dapat campur tangan.  (Ini biasanya gratis. Misalnya, ObservableCollection<T> menjamin ini, asalkan semua perubahan dilindungi oleh sinkronisasi.)

  5. Jika Anda memanggil DisableCollectionSynchronization, panggilan itu juga harus terjadi pada utas UI.

  6. Jika Anda ingin menggunakan koleksi yang sama pada beberapa utas UI, Anda harus memanggil EnableCollectionSynchronization (dan DisableCollectionSynchronization, jika diperlukan) secara terpisah pada setiap utas UI.

  7. Hindari kebuntuan.  Ini sudah menjadi tanggung jawab aplikasi setelah memilih untuk menggunakan sinkronisasi, tetapi juga harus memperhitungkan partisipasi WPF dalam sinkronisasi. (Lihat selengkapnya, di bawah ini.)

Sebagai imbalannya, WPF menyediakan perilaku berikut:

  • mengakses CollectionView koleksi menggunakan mekanisme penguncian.

  • CollectionView mempertahankan "salinan bayangan" koleksi untuk digunakan pada utas UI.

  • CollectionChanged peristiwa diantrekan saat tiba (di utas apa pun).

  • Peristiwa yang tertunda diterapkan ke salinan bayangan secara asinkron pada utas UI ketika memiliki kesempatan untuk melakukannya.

  • CollectionView tidak akan secara langsung menggunakan mekanisme sinkronisasi lain yang terlihat oleh aplikasi. Ini adalah cara WPF untuk membantu menghindari kebuntuan (lihat item sebelumnya 7).  

Efek bersihnya adalah Anda dapat mengubah koleksi pada utas apa pun, dan perubahan tersebut ItemsControl akhirnya muncul di saat utas UI memiliki waktu untuk "mengejar ketinggalan".  Implementasi telah disetel untuk membatasi laju yang berubah mengalir ke utas UI untuk menjaga utas latar belakang tidak menjenuhkan utas UI dan kelaparan respons terhadap input pengguna normal.

Berlaku untuk

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

Memungkinkan objek untuk berpartisipasi dalam akses yang disinkronkan CollectionView ke koleksi yang digunakan pada beberapa utas dengan menggunakan mekanisme selain kunci sederhana.

public:
 static void EnableCollectionSynchronization(System::Collections::IEnumerable ^ collection, System::Object ^ context, System::Windows::Data::CollectionSynchronizationCallback ^ synchronizationCallback);
public static void EnableCollectionSynchronization (System.Collections.IEnumerable collection, object context, System.Windows.Data.CollectionSynchronizationCallback synchronizationCallback);
static member EnableCollectionSynchronization : System.Collections.IEnumerable * obj * System.Windows.Data.CollectionSynchronizationCallback -> unit
Public Shared Sub EnableCollectionSynchronization (collection As IEnumerable, context As Object, synchronizationCallback As CollectionSynchronizationCallback)

Parameter

collection
IEnumerable

Koleksi yang membutuhkan akses yang disinkronkan.

context
Object

Objek yang diteruskan ke panggilan balik.

synchronizationCallback
CollectionSynchronizationCallback

Panggilan balik yang dipanggil setiap kali akses ke koleksi diperlukan. Anda dapat menggunakannya untuk memastikan bahwa koleksi diakses oleh satu utas pada satu waktu.

Keterangan

Aplikasi WPF dapat menampilkan kumpulan data menggunakan ItemsControl atau salah satu subkelasnya (ListBox, DataGrid, , TreeViewListView, dll.). WPF menyalurkan semua aksesnya ke koleksi melalui subkelas CollectionViewItemsControl Baik dan CollectionView memiliki afinitas pada utas tempat ItemsControl dibuat, yang berarti bahwa menggunakannya pada utas yang berbeda dilarang dan melemparkan pengecualian. Akibatnya, pembatasan ini juga berlaku untuk koleksi.

Anda mungkin ingin menggunakan koleksi pada beberapa utas.   Misalnya, Anda ingin memperbarui koleksi (menambahkan atau menghapus item) pada utas "pengumpulan data", sambil menampilkan hasil pada utas "antarmuka pengguna", sehingga UI tetap responsif saat pengumpulan data terjadi. Dalam situasi seperti itu, Anda bertanggung jawab untuk memastikan akses yang disinkronkan ("aman utas") ke koleksi dan untuk menjamin bahwa akses dari WPF (khususnya dari CollectionView) berpartisipasi dalam mekanisme sinkronisasi yang sama. Dengan memanggil EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) metode , Anda dapat melakukan ini dengan menggunakan mekanisme sinkronisasi seperti semaphores, peristiwa reset, dll.

Untuk menggunakan koleksi pada beberapa utas, salah satunya adalah utas ItemsControlUI yang memiliki , Anda harus melakukan hal berikut:

  1. Pilih mekanisme sinkronisasi.

  2. Sinkronkan semua akses dari aplikasi ke koleksi menggunakan mekanisme tersebut.

  3. EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) Panggil kelebihan beban untuk memberi tahu WPF bahwa Anda menggunakan mekanisme selain penguncian sederhana.

    • Panggilan harus terjadi pada utas UI.

    • Panggilan harus terjadi sebelum menggunakan koleksi pada utas yang berbeda atau sebelum melampirkan koleksi ke ItemsControl, mana pun nanti.

  4. Pastikan bahwa perubahan pada koleksi dan pemberitahuan perubahan tersebut (melalui INotifyCollectionChanged) bersifat atomik; tidak ada akses dari utas lain yang dapat campur tangan.  (Ini biasanya gratis. Misalnya, ObservableCollection<T> menjamin ini, asalkan semua perubahan dilindungi oleh sinkronisasi.)

  5. Jika Anda memanggil DisableCollectionSynchronization, panggilan itu juga harus terjadi pada utas UI.

  6. Jika Anda ingin menggunakan koleksi yang sama pada beberapa utas UI, Anda harus memanggil EnableCollectionSynchronization (dan DisableCollectionSynchronization, jika diperlukan) secara terpisah pada setiap utas UI.

  7. Hindari kebuntuan.  Ini sudah menjadi tanggung jawab aplikasi setelah memilih untuk menggunakan sinkronisasi, tetapi juga harus memperhitungkan partisipasi WPF dalam sinkronisasi. (Lihat selengkapnya, di bawah ini.)

Sebagai imbalannya, WPF menyediakan perilaku berikut:

  • mengakses CollectionView koleksi dengan memanggil yang terdaftar CollectionSynchronizationCallback dengan argumen berikut:

    • collection: pengumpulan minat.
    • context: objek konteks terdaftar.
    • accessMethod: delegasi yang melakukan akses aktual.
    • writeAccess: true jika delegasi akan memodifikasi koleksi; false jika tidak.

    Anda CollectionSynchronizationCallback harus membuat sinkronisasi pada koleksi (menggunakan context objek dan writeAccess nilai , sebagaimana mestinya), panggil accessMethod, lalu rilis sinkronisasi.

  • CollectionView mempertahankan "salinan bayangan" koleksi untuk digunakan pada utas UI.

  • CollectionChanged peristiwa diantrekan saat tiba (di utas apa pun).

  • Peristiwa yang tertunda diterapkan ke salinan bayangan secara asinkron pada utas UI ketika memiliki kesempatan untuk melakukannya.

  • CollectionView tidak akan secara langsung menggunakan mekanisme sinkronisasi lain yang terlihat oleh aplikasi. Ini adalah cara WPF untuk membantu menghindari kebuntuan (lihat item sebelumnya 7).  

Efek bersihnya adalah Anda dapat mengubah koleksi pada utas apa pun, dan perubahan tersebut ItemsControl akhirnya muncul di saat utas UI memiliki waktu untuk "mengejar ketinggalan".  Implementasi telah disetel untuk membatasi laju yang berubah mengalir ke utas UI untuk menjaga utas latar belakang tidak menjenuhkan utas UI dan kelaparan respons terhadap input pengguna normal.

Parameter context adalah objek arbitrer yang diteruskan ke callback. Anda dapat menggunakannya untuk menentukan mekanisme sinkronisasi yang digunakan untuk mengontrol akses ke collection. Context dapat berupa null.

Berlaku untuk