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?
0
A
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?
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 –
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(); –