2016-01-26 78 views
0

我的算法自動填充特定網站中的元數據(使用webBrowser)。填充元數據後,按下發送按鈕(在網站中),它必須等待幾秒鐘才能在contiune之前分析元數據(這不是算法的一部分,而是網頁)。問題是我無法知道元數據analsys何時完成。我試了下代碼,它被用來與過程,然後再繼續等待完全加載的網頁:C#如何有效等待x秒

webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); 

但它是無用becuse元數據分析是不相關的網頁加載。

所以,因爲元數據分析需要大約20-40秒,我認爲等待大約60秒,繼續是一個很好的解決方案。我嘗試:

System.Threading.Thread.Sleep(60000); 

後編程按鍵「發送」,但對於anyreason此等待60秒按下按鈕之前。

+5

後調用按鈕 – Overmachine

+4

的方法,其程序是故意設置掛足足有一分鐘的任何解決方案不是好的解決方案 – Abion47

+0

它看起來像你正在做純C#自動化,我不知道爲什麼,但我的建議是知道你想要關注哪個行爲。按下按鈕後會出現網址更改?一個像素的變化? – celerno

回答

0

我不認爲我完全理解爲什麼你想要做你在這裏要求的,所以我試圖用我在這裏得到的信息來回答這個問題。

如果您在事件處理程序(例如,Button的單擊事件的事件處理程序)中調用Thread.Sleep,Thread.Sleep將有效地暫停程序,因爲您仍在UI線程中。我猜這不是你想要的?

如果您希望UI線程繼續(您可能在做大部分工作),則需要使按鈕的Click處理器異步,並使用await Task.Delay代替。你可以在這裏看到所使用的模式:Should I avoid 'async void' event handlers?

此外,你也許可以想出一個辦法利用這裏詳述技術回調到您的應用程序:http://www.codeproject.com/Articles/35373/VB-NET-C-and-JavaScript-communication

使用這種方法,我敢肯定,你可以得到完全擺脫等待。

0

我知道在這種情況下使用異步操作是非常好的選擇。但我會建議另一種方式。

我想這是一個Windows窗體應用程序,所以你可以使用System.Windows.Forms.Timer來做到這一點。按下發送按鈕後,您將計時器間隔設置爲60000並添加一個事件處理程序。

首先添加一個名爲t的字段,以便所有實例方法都有權訪問它。

Timer t = new Timer(); 

然後,

//code to press the send button here 
t.Interval = 60000; 
t.Tick += DoStuff; 
t.Start(); 

事件處理程序是這樣的:

private void DoStuff (object sender, EventArgs e) { 
    t.Stop(); 
    //Do whatever you want here 
} 

如果你不使用Windows窗體,你應該使用System.Timers.Timer(類似於Windows窗體一個)或System.Threading.Timer(這很難使用)。你可以在這裏閱讀文檔:

System.Timers.Timerhttps://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

System.Threading.Timerhttps://msdn.microsoft.com/en-us/library/system.threading.timer(v=vs.110).aspx