2012-09-10 31 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(),但有時我的代碼卡住了,所以沒有達到任何,所以讓我知道是否有任何方法。

+0

是的你可以:http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer.aspx但是,似乎是一個醜陋的黑客給我。爲什麼不使用異常? –

回答

0

正如你已經阻塞th.Join,你可以用它來終止線程,就像這樣:

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

如果您不希望阻止上加入,那麼你可以生成一個第二看門狗線程只存在於Join上,並執行超時和終止任務,而不是煽動者線程。

另外,使用Application.ExitThread不是很好的設計。線程可以從它們的入口點方法終止return - 它也消除了對Application類及其關聯的程序集的不必要依賴。

+0

謝謝你現在就試試看,也肯定會刪除Application.ExitThread – confusedMind

+0

只是一個簡單的問題,上面的語句會終止線程,不管它在做什麼(坐着閒置或做一些工作)? – confusedMind

+0

'Abort'會導致在該線程上引發一個'ThreadAbortedException',而不管它的當前位置。請注意,線程不會「閒置」 - 它們要麼被掛起(等待IO完成或阻塞),要麼主動執行某些東西。無論如何,'ThreadAbortedException'將被拋出。 – Dai