2010-08-05 7 views
0
var t = new Thread(new ParameterizedThreadStart(DoWork)); 
    t.SetApartmentState(ApartmentState.STA); 
    t.IsBackground = true; 
    t.Start(App.Current.MainWindow); 

    public static void DoWork(object owner) 
    { 
     var progressDlg = new ProgressBarDialog(); 

     // progressDlg.Owner = (Window)owner; // This doesn't work 

     progressDlg.ShowDialog(); 
    } 

Maintenant, dites-moi s'il vous plaît est-il possible de le faire fonctionner?Comment accéder à Window depuis un autre thread?

App.Current.MainWindow dans l'exemple non accessible à partir d'un autre thread.

Et aussi j'ai entendu parler de la nouvelle façon cool de Parallel.Invoke() mais je ne sais pas est-ce applicable à cette situation ou non. J'apprécie que vous me montriez comment cela fonctionne.

+0

Je ne peux que supposer ProgressBarDialog est une fenêtre de quelque sorte, je suppose une fenêtre WPF. Vous ne pouvez pas créer un élément d'interface utilisateur dans un thread et définir le propriétaire sur quelque chose qui appartient à un thread différent. –

Répondre

0

Il n'est pas possible d'accéder à l'interface utilisateur à partir d'un thread d'arrière-plan, toutes vos mises à jour doivent figurer dans le thread principal. Cela inclut la définition de propriétés de dépendance, comme vous essayez de le faire dans le cas ci-dessus. Vous pouvez contourner cela en utilisant le Dispatcher.

Quelque chose comme ça

Action x = (Action)delegate { 
     //do my UI updating 
    }; 
    Dispatcher.Invoke(x, new object[] { }); 

qui est la même réponse que j'ai here...

+0

cela ne fonctionne pas car je ne peux pas accéder au propriétaire (Window) à partir d'un thread séparé. Mais théoriquement, ce n'est pas quelque chose d'impossible. Il devrait y avoir un moyen de créer une fenêtre dans un autre thread et d'obtenir le propriétaire de cette fenêtre à partir du thread principal. – Agzam

Questions connexes