我有一個方法browseWebsite()
,它使用瀏覽器控件瀏覽網站以自動更改該網站內的數據。 webbrowser控件在方法執行時被實例化。不幸的是,部分被打開的網站是通過ajax加載的,因此webbrowser控件無法檢測到網站加載完成的正確時間,這意味着我無法使用DocumentCompleted
事件在頁面加載時進一步移動。爲了解決這個問題,我實例化一個System.Windows.Forms.Timer
,等待10秒鐘,直到他讓瀏覽器在網站上繼續前進。 (線程睡眠不工作,因爲web瀏覽器與線程一起凍結和停止加載過程) 整個事情是這樣的:在新線程中的C#計時器
private void Form1_Load(object sender, EventArgs e)
{
Thread thread = new Thread(() => browseWebsite());
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
public void browseWebsite()
{
WebBrowser browser = new WebBrowser();
browser.Navigate("somesite");
Timer waitTimer = new Timer();
waitTimer.Interval = 10000;
waitTimer.Tick += delegate (object sender, EventArgs e) { WaitTimer_Tick(sender, e, browser); };
waitTimer.Start();
}
private void WaitTimer_Tick(object sender, EventArgs e, WebBrowser browser)
{
browser.Navigate("somewhere else");
}
由於整個過程這種方法確實是相當漫長和複雜的,我不我不想搞亂我的主線程,其中有50個webrowsers在它內部單擊,我想在另一個線程中啓動該過程。不幸的是,線程在達到方法的最後一行時死亡,並且帶着web瀏覽器和計時器。有沒有辦法像這樣實例化一個程序?或保持線程活着?
沒有線程!?使用另一個計時器:System.Timers.Timer或更好的System.Threading.Timer。 – JeffRSon
我的不好,改變了Form1_Load事件。 – colosso
線程不會「死」 - 它已完成。或者你有例外嗎?您需要在線程內等待 - 查看AutoResetEvent或ManualResetEvent。並使用另一個計時器。 – JeffRSon