2017-01-25 3 views
0

Je dois créer une fenêtre avec le chargement de gif lorsque ma fenêtre principale est en cours de rendu. J'ai lu quelques articles et j'ai pris la décision de créer un nouveau fil à cette fin. Je l'ai fait comme dans this articleWPF Fenêtre de loisirs dans un thread STA différent

En conséquence, j'ai quelque chose comme ça:

LoadingDialog _loadingDlg; 
Thread loadingThread; 

public void ShowLoading() 
{ 
    loadingThread = new Thread(new ThreadStart(loadingThreadWork)); 
    loadingThread.SetApartmentState(ApartmentState.STA); 
    loadingThread.Start(); 
} 

private void loadingThreadWork() 
{ 
    _loadingDlg = new LoadingDialog(); 
    _loadingDlg.Show(); 
    System.Windows.Threading.Dispatcher.Run(); 
} 

public void HideLoading() 
{ 
    _loadingDlg.Dispatcher.InvokeShutdown(); 
} 

première fois quand je l'appelle ShowLoading() puis HideLoading() tout fonctionne comme je veux. Mais quand je l'appelle ShowLoading() à la deuxième fois que je reçois une exception à

_loadingDlg.Show(); 

avec le message The calling thread cannot access this object because a different thread owns it.

Comment cela peut-il être? _loadingDlg est créé dans la ligne précédente et dans le même fil.

+0

Pourquoi créer une nouvelle fenêtre? Pourquoi ne pas simplement faire une grille centrée, avec une visibilité que vous basculez? –

Répondre

0

Dans le loadingThreadWork vous créez le contrôle, avant la première exécution, il s'agit d'un null, donc la première fois, vous réussissez. Toutefois, vous créez la boîte de dialogue dans un thread différent, qui est marqué en tant que propriétaire du contrôle. A la prochaine fois que vous appelez le loadingThreadWork, le contrôle n'est pas nul, et la modification d'un thread différent (et c'est un thread différent, parce que vous le créez à nouveau) mène à l'exception tu as. Comme vous utilisez WPF, vous devriez probablement passer des threads aux opérations async, qui sont beaucoup plus lisibles, supportables et prévisibles que votre solution actuelle.

+0

Merci. Avec vous, j'ai trouvé le moyen de résoudre mon problème. Est-il vrai que le propriétaire est déterminé pour la classe et non par exemple? Pouvez-vous donner un article quand je peux lire plus de détails à ce sujet. –

+0

Non, le propriétaire est déterminé par instance. Vous pouvez rechercher par erreur de message, ceci est une erreur commune. – VMAtm

+0

Mais avec un nouveau thread j'ai recréé une instance. Et après cela, je reçois une exception. –