J'ai un peu de problème avec l'interruption de mon interface utilisateur, même si j'utilise un Dispatcher, et avant que je n'aille plus loin, je me demande si c'est la façon dont je gère la récupération de données.WPF Multithreading: Utilisation de Dispatcher mais l'interface utilisateur se bloque toujours?
En ce moment j'ai ma fenêtre principale créant un View et ViewModel. Puis, à l'intérieur d'un nouveau Thread (en utilisant un Dispatcher), il définit le View.DataContext = ViewModel. Un très grand ObservableCollection est créé paresseusement lorsque la reliure se déclenche et cause le ralentissement. Cependant, il semble que certains des autres éléments de l'interface utilisateur qui doivent apparaître avant que slowdow n'apparaissent pas.
private void ButtonClick(Object sender, RoutedEventArgs e)
{
MyView view = new MyView();
MyViewModel vm = new MyViewModel();
TabItem tabItem = new TabItem();
tabItem.Header = "MyView";
tabItem.Content = view;
MyTabCollection.Items.Add(tabItem);
Window working = new Working();
working.Show();
ThreadStart thread = delegate()
{
DispatcherOperation operation = Dispatcher.BeginInvoke(
DispatcherPriority.Normal,
new Action(delegate()
{
view.DataContext = vm;
((FrameworkElement)view.Parent).Focus();
working.Close();
}
)
);
};
Thread theThread = new Thread(thread);
theThread.Start();
}
Cela dit, fondamentalement, il est censé créer une vue et un viewmodel, puis ajoutez la vue de la collection onglet je (ce qui signifie qu'il doit montrer le nouvel onglet au moins). Et, il devrait également montrer une fenêtre "Working ...". Après cela, un thread séparé est censé lier le ViewModel à la vue, se concentrer sur cet onglet et fermer la fenêtre de travail. Le problème est que la première partie ne montre pas jusqu'à ce que tout soit fait; L'onglet n'est pas affiché et la fenêtre de travail n'est pas affichée tant que le nouveau thread n'est pas terminé (ce qui provoque l'affichage/fermeture immédiate de la fenêtre de travail). Je suppose que cela pourrait avoir à faire avec la façon dont je récupère les données, mais je ne suis pas sûr. Voici la façon dont il le fait:
- Créer une vue
- Créer ViewModel
- Créer TabItem avec le contenu ensemble à la vue et ajouter le TabItem au TabCollection.
- Créer/Afficher la fenêtre "Working ..."
- Dispatcher: Définir View.DataContext = ViewModel. Cet événement déclenche les DataBindings, qui à leur tour récupèrent ObservableCollection. Puisque le CO est créé par Lazily, il est en train d'être créé (c'est le goulot d'étranglement). < - Est-ce que cela gâche mon thread/expéditeur séparé?
- Dispatcher: définir le focus sur l'onglet
- Fermer la fenêtre "Working ..."
Je me sorta ce que vous dites ... mais si j'ai mes cours séparé comme ceci: View, ViewModel , Model et DAL (DataAccessLayer) Où dois-je lancer ce thread séparé pour que cela fonctionne réellement? –
@myermian: Cela dépend vraiment du fonctionnement de votre code. Vous pouvez appeler votre DAL ou votre modèle avec un appel asynchrone pour * obtenir * les données, puis revenir au fil de l'interface utilisateur quand tout est là. –