2010-12-15 154 views
0

J'ai une application qui exécute un processus qui doit ouvrir un explorateur Internet, aller à une adresse URL, y faire des choses, entrer des données, et revenir.
Cela prend généralement un certain temps (plusieurs pages à remplir, peu importe). Le problème est que, pendant ce processus, l'interface utilisateur de l'application appelante (une application wpf standard) ne répond pas/est gelée. Lorsque le processus revient, j'ai quelques informations que je dois définir dans l'un des objets de l'application WPF

Le problème principal est que IE doit être appelé à partir d'un thread STA, si j'essaie de l'appeler à partir de l'intérieur de la Dispatcheur asynchrone ou synchrone, pour une raison quelconque l'interface utilisateur est bloquée (j'ai essayé avec différents DispatcherPriority-es, mais n'a pas eu de chance). Si je démarre un nouveau BackgroundWorker, ce thread est en mode MTA (et je ne peux pas le rebrancher), donc il y a un problème et j'ai une exception

Je suis vraiment perdu ici, quelqu'un pourrait mettre un peu de lumière dans ce? Peut-être que ce que je veux faire n'est tout simplement pas possible.Ouvrez l'objet COM InternetExplorer pour effectuer une certaine automatisation à l'aide de Wating à partir de l'application WPF, mais veillez à ce que l'interface utilisateur soit réactive. Est-ce possible?

Répondre

0

Avez-vous essayé de créer votre propre thread d'arrière-plan (ne vous fiez pas à BackgroundWorker) et paramétrez ApartmentState sur STA?

+0

J'ai essayé cela, et j'ai obtenu un "Impossible de définir l'état de l'appartement COM spécifié." InvalidOperationException sur le Thread.CurrentThread.SetApartmentState (ApartmentState.STA); appelez –

+0

ok, j'ai réussi à le résoudre en utilisant cette approche. Thread workerThread = nouveau Thread (nouveau ThreadStart (() => {doMyStuff();})); \t \t \t \t \t \t workerThread.SetApartmentState (ApartmentState.STA); \t \t \t \t \t \t workerThread.Start(); –