2009-08-05 50 views
1

我正在使用webrequest获取一些图像数据。该网址可能会在某个时间被盗用。在URL无效的情况下,begingetresponse所花时间等于超时期限。在此期间控制也变得没有反应。换句话说,异步回调不是异步工作的。这是预期的行为?webrequest.begingetresponse在URL无效时花费太多时间

try 
           { 
            // Async requests 
            WebRequest request = WebRequest.Create(uri); 
            request.Timeout = RequestTimeOut; 
            RequestObject requestObject = new RequestObject(); 
            requestObject.Request = request; 
            request.BeginGetResponse(this.ProcessImage, requestObject); 
           } 
           catch (Exception) 
           { 
            ShowErrorMessage(uri); 
           } 

private void ProcessImage(IAsyncResult asyncResult) 
     {    
      try 
      { 
       RequestObject requestObject = (RequestObject)asyncResult.AsyncState; 
       WebRequest request = requestObject.Request; 
       WebResponse response = request.EndGetResponse(asyncResult); 

       Bitmap tile = new Bitmap(response.GetResponseStream()); 
       // do something 
      } 
      catch (Exception) 
      { 
       ShowErrorMessage(); 
      } 
     } 
+0

不,预期的行为将会是如果您使用BeginGetResponse UI保持响应。您可以向我们展示您调用BeginGetResponse的代码片段吗? – bernhof 2009-08-05 09:51:11

+0

在发送之前,您有任何方法可以验证该网址吗?我认为你所要求的服务器对你来说是一个黑匣子,无法访问该代码? – Sebastian 2009-08-05 12:27:14

回答

2

看起来像这是.NET的问题。 BeginGetResponse块直到DNS解析。如果URL错误(如http://somecrap),它会尝试,直到它超时。看到下面的链接 - link1link2

1

我刚刚遇到了这种情况。尽管这不是一个完美的解决方法,但我决定先使用Ping.SendAsync()来ping站点。好的部分是立即返回异步部分。不好的部分是额外的步骤,并非所有网站都对Ping请求做出响应。

public void Start(WatchArgs args) 
{ 
     var p = new System.Net.NetworkInformation.Ping(); 
     args.State = p; 
     var po = new System.Net.NetworkInformation.PingOptions(10, true); 
     p.PingCompleted += new PingCompletedEventHandler(PingResponseReceived); 
     p.SendAsync(args.Machine.Name, 5 * 1000, Encoding.ASCII.GetBytes("watchdog"), po, args); 
} 

private void PingResponseReceived(object sender, .PingCompletedEventArgs e) 
{ 
    WatchArgs args = e.UserState as WatchArgs; 
    var p = args.State as System.Net.NetworkInformation.Ping; 
    p.PingCompleted -= new System.Net.NetworkInformation.PingCompletedEventHandler(HttpSmokeWatcher.PingResponseReceived); 
    args.State = null; 
    if (System.Net.NetworkInformation.IPStatus.Success == e.Reply.Status) 
    { 
     // ... BeginGetResponse now 
    } 
    else 
    { 
     /// ... machine not available 
    } 
} 

只是代码和运行一天,但最初的结果看起来很有希望。