2014-07-13 2 views
-3

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 son ApartmentState 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?

+1

@Servy a une belle enveloppe de tâches autour de la 'thread' classe [ici] (http://stackoverflow.com/questions/16720496/set-apartmentstate-on-a-task) –

+1

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

Répondre

1
Thread t = new Thread(() => 
{ 
    StartDownload(); 
    Application.Run(); 
}); 
t.SetApartmentState(ApartmentState.STA); 
t.Start(); 
Questions connexes