.NET開發的網站,如果不是使用預編譯發布,網站會在iis6應用池回收后第一次訪問很慢,為了解決這個問題,今天寫了一個自動瀏覽的工具,現在分享給大家,界面如下。
關鍵部分源碼
//手動點擊瀏覽 private void btnBrowsing_Click(object sender, EventArgs e) { if (btnBrowsing.Enabled == true && chkEnableAutomaticBrowsing.Checked == true) { btnBrowsing.Enabled = false; Thread thread = new Thread(new ThreadStart(AutoBrowsing)); thread.IsBackground = true; thread.Start(); } else { MessageBox.Show("任務正在執行!"); } } DateTime tempTime = DateTime.MinValue;//防止一分鍾內刷新多次 private void timer1_Tick(object sender, EventArgs e) { DateTime dt = DateTime.Now; //轉鍾時清除一天日志 if (dt.ToLongTimeString() == "0:00:00") { rtxtLogs.Text = string.Empty; } TimeSpan ts = dt - tempTime; //1分鍾內不得刷新兩次 if (ts.TotalMinutes > 0) { //到點自動刷新 if (lstTime.Items.Contains(dt.ToShortTimeString())) { tempTime = dt.AddMinutes(1); btnBrowsing_Click(null, null); } } } private void AutoBrowsing() { int itemTotalCount = 0; CrossThreadCalls.SafeInvoke(this.lvWebsitInfo, new CrossThreadCalls.TaskDelegate(delegate() { itemTotalCount = lvWebsitInfo.Items.Count; })); for (int i = 0; i < itemTotalCount; i++) { string url = string.Empty; CrossThreadCalls.SafeInvoke(this.lvWebsitInfo, new CrossThreadCalls.TaskDelegate(delegate() { url = lvWebsitInfo.Items[i].SubItems[2].Text; })); int retry = 0; retryFlag: CrossThreadCalls.SafeInvoke(this.webBrowser1, new CrossThreadCalls.TaskDelegate(delegate() { webBrowser1.Navigate(url); })); if (WaitWebPageLoad()) { CrossThreadCalls.SafeInvoke(this.rtxtLogs, new CrossThreadCalls.TaskDelegate(delegate() { rtxtLogs.AppendText(url + "瀏覽成功,瀏覽時間:" + DateTime.Now.ToLongTimeString() + "\r\n\r\n"); rtxtLogs.ScrollToCaret(); })); CrossThreadCalls.SafeInvoke(this.lvWebsitInfo, new CrossThreadCalls.TaskDelegate(delegate() { lvWebsitInfo.Items[i].SubItems[3].Text = DateTime.Now.ToString(); })); } else { CrossThreadCalls.SafeInvoke(this.rtxtLogs, new CrossThreadCalls.TaskDelegate(delegate() { rtxtLogs.AppendText(url + "瀏覽失敗,即將重試" + (retry + 1) + "次\r\n"); rtxtLogs.ScrollToCaret(); })); if (retry < 2)//重試3次 { retry++; Thread.Sleep(3000); goto retryFlag; } CrossThreadCalls.SafeInvoke(this.rtxtLogs, new CrossThreadCalls.TaskDelegate(delegate() { rtxtLogs.AppendText(url + "瀏覽失敗\r\n\r\n"); rtxtLogs.ScrollToCaret(); })); CrossThreadCalls.SafeInvoke(this.lvWebsitInfo, new CrossThreadCalls.TaskDelegate(delegate() { lvWebsitInfo.Items[i].SubItems[3].Text = "自動瀏覽失敗"; })); } } CrossThreadCalls.SafeInvoke(this.btnBrowsing, new CrossThreadCalls.TaskDelegate(delegate() { btnBrowsing.Enabled = true; })); CrossThreadCalls.SafeInvoke(this.webBrowser1, new CrossThreadCalls.TaskDelegate(delegate() { webBrowser1.Navigate("about:blank"); })); } /// <summary> /// 判斷webbrowser是否加載一個網頁完畢,可判斷包括iframe的網頁 /// </summary> /// <returns></returns> private bool WaitWebPageLoad() { int i = 0; string sUrl = string.Empty; while (true) { Thread.Sleep(2000); WebBrowserReadyState webBrowserState = WebBrowserReadyState.Uninitialized; CrossThreadCalls.SafeInvoke(this.webBrowser1, new CrossThreadCalls.TaskDelegate(delegate() { webBrowserState = webBrowser1.ReadyState; })); if (webBrowserState == WebBrowserReadyState.Complete) //先判斷是否發生完成事件。 { bool isBusy = true; CrossThreadCalls.SafeInvoke(this.webBrowser1, new CrossThreadCalls.TaskDelegate(delegate() { isBusy = webBrowser1.IsBusy; })); if (!isBusy) //再判斷是瀏覽器是否繁忙 { i = i + 1; if (i == 2) { CrossThreadCalls.SafeInvoke(this.webBrowser1, new CrossThreadCalls.TaskDelegate(delegate() { sUrl = webBrowser1.Url.ToString(); })); if (sUrl.Contains("res") || sUrl.Contains("daohang.114so.cn")) //這是判斷沒有網絡的情況下 { return false; } else { return true; } } continue; } i = 0; } } }
最新源碼下載
歷史源碼下載
更新日志:
2014-8-13
1.修復網站加載完畢有時候判斷失敗問題。
2.修復cpu占用很高問題。