2016-09-24 163 views
1
try 
{ 
    WebRequest request = WebRequest.Create("http://facebook.com"); 
    HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 

    MessageBox.Show("I am here!");  // Not run     
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Error Occurred!"); //Not run! 
} 

在我的國家臉書被過濾和當我運行這個代碼時,沒有任何異常將被拋出,也程序不顯示消息「我在這裏! 發生了什麼?不會拋出的異常

我想在timer_tick中每1分鐘使用一次這段代碼,並用活動狀態更新ui標籤。你有其他方法嗎?

+0

你是什麼意思的「過濾」?如果您將URL輸入瀏覽器,您會看到什麼? – Krumelur

+0

MessageBox.Show()應該被調用,所以它會出現他們沒有做你期望他們做的事情。你可以在它們上面放置一個斷點來查看哪個被調用? 根據過濾方式的不同,即使無法訪問網站,也可能不會拋出異常。 – LittleDebugger

+0

是什麼讓你覺得它應該拋出異常?只是因爲該網站被阻止,並不意味着整個請求失敗。這很可能是請求被重定向到「阻止」頁面,和/或HTTPStatus代碼不是200 – Rob

回答

0

我猜你的timer_tick()的間隔值小於w​​eb請求的默認超時值,然後在當前回合完成之前執行下一個計時器回合。因此使用您的請求的超時時間也最好使用任務不凍結ui時運行計時器。

Task task = Task.Factory.StartNew(() => 
{ 
    WebRequest request = WebRequest.Create("http://facebook.com"); 
    request.Timeout = 5000; 
    HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 

}); 

// Run this code after successfully completing the task... 
task.ContinueWith(t => 
{ 
    websiteIsAvailable = true; 
    //Some code... 
}, TaskContinuationOptions.OnlyOnRanToCompletion); 

// Run this code after task Failure... 
task.ContinueWith(t => 
{ 
    websiteIsAvailable = false; 
    //Some code... 
}, TaskContinuationOptions.OnlyOnFaulted);