Comment gérer ObservableCollection <> résultat d'une tâche dans parallélisés MVVM?
-
26-09-2019 - |
Question
Je recueille des données dans une tâche séparée et je veux des données lier le résultat à un composant d'interface graphique en utilisant un ObservableCollection<>
. Donc, mon code ressemble à ceci:
private ObservableCollection<MyItem> _items;
public ObservableCollection<MyItem> Items
{
get { return _items; }
set
{
if (_items.Equals(value))
{
return;
}
_items = value;
RaisePropertyChanged("Items");
}
}
private void LoadData()
{
Task task = Task.Factory.StartNew(() =>
{
ObservableCollection<MyItem> itms = _htmlParser.FetchData(...);
Dispatcher.CurrentDispatcher.Invoke((Action)delegate
{
Items = itms;
});
});
}
Les données sont extraites d'un composant faisant des requêtes HTTP. L'erreur que je reçois est:
Must create DependencySource on same Thread as the DependencyObject.
J'utilise le cadre de Light Toolkit MVVM. J'ai aussi essayé d'envoyer le résultat comme un message, mais qui a fini dans le même message d'erreur. Toutes les idées ou des pointeurs?
EDIT: Voici la question:
public class MyItem
{
public string Id { get; set; }
public string Name { get; set; }
public BitmapImage Image { get; set; } // <--- A big No No because it inherits from the DependencyObject
public Uri Uri { get; set; }
}
J'ai changé le BitmapImage
à un type de données byte[]
.
La solution
L'exception que vous obtenez ( « doit créer DependencySource sur un même fil que le DependencyObject ») indique avoir été créé sur un thread d'arrière-plan et utilisé sur le thread d'interface utilisateur de ce quelque chose. Y a-t-il des contrôles d'interface utilisateur créés et stockés dans la collection pour une utilisation par l'interface utilisateur?
Je vois que le ObservableCollection lui-même est en cours de création sur un fil de fond, mais je ne pense pas que ce soit la question - malheureusement je ne suis pas dans le bureau au code et confirmer que
.Autres conseils
Pouvez-vous essayer de remplacer le Dispatcher.CurrentDispatcher
en Application.Current.Dispatcher
pas sûr de ce que