2014-07-13 3 views
-3

나는 WatiN를 사용하여 웹 사이트를 로그인하고 있습니다. WatiN은 실행될 스레드에 STAThread attribute이 적용되어야합니다. 지금까지는 모든 것이 좋았지 만 이제는 오랜 시간이 걸립니다. WPF을 사용 중이므로 UI이 응답해야합니다. 이 같은 그래서 시도 뭔가 : 내 작업을 시작했을 때WatiN을 비동기 적으로 사용하여 웹 사이트에 로그인하려면 어떻게해야합니까?

_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 

} 

, 나는 new IE(LoginUrl)ThreadStateException를 얻을 :

CurrentThread 필요는 ApartmentState 세트 ApartmentState.STA에 인터넷 익스플로러를 자동화 할 수있어해야합니다 .

다른이 내 방법에 STAThread을 적용하는 시도했지만 내가 런타임에 생성되거나 스레드에 STAThread 속성을 적용 할 수 있는지 궁금 해요 succeeded.Now 없습니다 볼 수 있듯이 이 일을하는 방법?

+1

@Servy 내용은 [여기]'Thread' 클래스 주위에 좋은 작업 래퍼가 있습니다 (http://stackoverflow.com/questions/16720496/set-apartmentstate-on-a-task) –

+1

또한 사용할 수 있습니다 (MessageLoopApartment') (http://stackoverflow.com/a/21808747/1768303), 익숙한'Task Run (Action)'과'Task Run (Func )'래퍼를 제공합니다. – Noseratio

답변

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