2012-09-10 2 views
0

1 분 후에 무슨 일이 있어도 끝내는 스레드를 만들 수있는 방법이 있습니까? 그래서 난 내가 뭔가를 생각하고 무엇을, 그들 모두를 코딩하고 싶지 않은스레드에 대한 자체 파괴 타이머?

private void runBrowserThread() 
    { 

     specialCheck = 0; 
     var th = new Thread(() => 
     { 
      var br = new WebBrowser(); 
      browserCounter = 0; 
      br.ScriptErrorsSuppressed = true; 
      br.DocumentCompleted += browser_DocumentCompleted; 
      br.Navigate("https://www.xample.com/login"); 
      Application.Run(); 

     }); 

     th.SetApartmentState(ApartmentState.STA); 
     th.Start(); 
     th.Join(); 
    } 

하지만 그 과정에서 합병증이 많이있다 :

현재 내가 아래에있는 스레드가 웹 사이트 코드에 로그인 할 수 있도록 자기 파괴 같은 내가이 타이머를 만들 때 사용할 수있는 코드가 붙어 있다면 상관없이, 그것은 Application.Exitthread() 중 하나에 도달하지 않습니다 영원히 거기에 붙어있을 것입니다 그래서 자기가 1 분 후에 파괴, 그래서 스레드를 종료합니다 코드를 계속 사용할 수 있습니다.

현재 많은 곳에서 Application.Exitthread()을 가지고 있기 때문에 때로는 코드가 달라 붙지 않으므로 어떤 방법이 있다면 알려 주시기 바랍니다. 이미 th.Join을에 차단하고 따라

+0

예 u can : http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer.aspx 그러나 나에게는 못생긴 해킹 인 것 같습니다. 예외를 사용하지 않는 이유는 무엇입니까? –

답변

0

당신과 같이 스레드를 종료하는 것을 사용할 수 있습니다

Boolean success = th.Join(60 * 1000); // 60 second timeout 
if(!success) th.Abort(); 

당신이 가입에 차단하지 않으려면, 당신은 두 번째 감시 스레드를 생성 할 수있다 이는 단지 Join을 차단하고 발언자 스레드 대신 시간 초과 및 종료 작업을 수행하기 위해서만 존재합니다.

또한 Application.ExitThread의 사용은 좋지 않습니다. 스레드는 해당 진입 점 메서드에서 return으로 종료 할 수 있으며 Application 클래스 및 이와 관련된 System.Windows.Forms 어셈블리에 대한 불필요한 종속성도 제거합니다.

+0

지금 시도해 주셔서 감사합니다. 또한 Application.ExitThread를 반드시 제거합니다. – confusedMind

+0

위의 문구는 스레드가 어떤 일을 하던지 (유휴 상태이거나 일부 작업 수행) 상관없이 종료됩니다. – confusedMind

+0

'Abort'는 스레드의 현재 위치에 관계없이 스레드에서 'ThreadAbortedException'을 발생시킵니다. 스레드는 "유휴"상태가 아니며, IO가 완료되거나 차단 될 때까지 대기하거나 무언가를 적극적으로 실행합니다. ThreadAbortedException는 관계없이 발생합니다. – Dai