Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh mengubah suai ObservableCollection daripada Benang Berbeza dalam Aplikasi WPF Tanpa Pelanggaran Perkaitan Benang Penghantar?

Bagaimanakah saya boleh mengubah suai ObservableCollection daripada Benang Berbeza dalam Aplikasi WPF Tanpa Pelanggaran Perkaitan Benang Penghantar?

DDD
DDDasal
2024-10-30 15:20:51383semak imbas

How Can I Modify an ObservableCollection from a Different Thread in a WPF Application Without a Dispatcher Thread Affinity Violation?

Pelanggaran Perkaitan Benang Penghantar dengan Pengubahsuaian ObservableCollection

Dalam aplikasi WPF, jenis koleksi tertentu, termasuk DataGrid, mesti diubah suai daripada Dispatcher benang. Ini kerana koleksi ini mengekalkan perkaitan dengan utas UI dan cuba mengubah suainya daripada utas lain boleh membawa kepada pengecualian seperti "Jenis CollectionView ini tidak menyokong perubahan pada SourceCollection daripada utas yang berbeza daripada utas Dispatcher."

Dalam kod yang disediakan, ObservableCollection _matchObsCollection dalam MainWindowViewModel dicipta pada urutan UI. Walau bagaimanapun, kaedah Load(), yang mengubah suai koleksi ini, dipanggil secara tak segerak. Ini menyebabkan pengecualian kerana pengubahsuaian dicuba daripada urutan selain daripada urutan UI.

Penyelesaian:

Untuk menyelesaikan isu, sebarang pengubahsuaian pada _matchObsCollection mesti dilakukan pada benang Dispatcher. Ini boleh dicapai dengan menggunakan kaedah Dispatcher.Invoke() untuk mewakilkan pengubahsuaian kepada urutan UI.

Berikut ialah versi diubah suai kaedah Load() yang menggunakan Dispatcher.Invoke() untuk mengubah suai ObservableCollection pada urutan UI:

public void Load()
{
    matchList = new List<GetMatchDetailsDC>();
    matchList = proxy.GetMatch().ToList();

    foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
    {
        App.Current.Dispatcher.Invoke((Action)delegate
        {
            _matchObsCollection.Add(match);
        });
    }
}

Kod yang diubah suai ini memastikan bahawa semua pengubahsuaian pada _matchObsCollection diwakilkan kepada urutan UI, menyelesaikan pengecualian.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengubah suai ObservableCollection daripada Benang Berbeza dalam Aplikasi WPF Tanpa Pelanggaran Perkaitan Benang Penghantar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn