J'utilise WatiN
pour vous connecter à un site Web. WatiN
nécessite STAThread
attribute pour être appliqué sur le thread qui sera en cours d'exécution. Jusqu'à présent, tout était bien mais maintenant j'ai une longue tâche. J'utilise WPF
et je dois répondre UI
. J'ai donc essayé quelque chose comme ceci:Comment puis-je me connecter à un site Web en utilisant WatiN de manière asynchrone?
_downloadTask = new Task(StartDownload, _cancelationToken.Token);
[STAThread]
public override void StartDownload()
{
if(IsLoginNeeded)
{
bool result = Login();
// check the result and do some other work..
}
}
[STAThread]
public bool Login()
{
if (_browser == null)
_browser = new IE(LoginUrl); // exception
}
Quand j'ai commencé ma tâche, je reçois ThreadStateException
sur new IE(LoginUrl)
:
Les
CurrentThread
doit avoir sonApartmentState
ensemble àApartmentState.STA
pour pouvoir automatiser Internet Explorer .
Comme vous pouvez le voir, je l'ai essayé d'appliquer STAThread
sur mes méthodes, mais je ne pouvais pas succeeded.Now Je me demande s'il est possible d'appliquer STAThread
attribut à un fil qui est créé sur l'exécution ou est-il une autre façon de le faire?
@Servy a une belle enveloppe de tâches autour de la 'thread' classe [ici] (http://stackoverflow.com/questions/16720496/set-apartmentstate-on-a-task) –
Vous pouvez également utiliser my ['MessageLoopApartment'] (http://stackoverflow.com/a/21808747/1768303), il fournit des wrappers familiers' Task Run (Action) 'et' Task Run (Func >). –
Noseratio