2016-09-24 160 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);