2009-08-03 121 views
2

我打电话给服务器api并等待响应。我只能在得到服务器响应后才能继续。但有些时候服务器响应只有在一段时间后才会收到,而我的标题栏显示“Not responding”消息。我该如何解决这个问题。没有响应显示在标题栏

我的代码块是

private string SubmitDocument(XmlDocument xmlinput, string URL) 
    { 
     try 
     { 
      // get the data from the xml document into a byte stream 
      Byte[] byteinput = System.Text.Encoding.UTF8.GetBytes(xmlinput.OuterXml); 

      // instantiate a web client 
      System.Net.WebClient myWebClient = new System.Net.WebClient(); 
      myWebClient.Headers.Add("Content-Type", "text/xml"); 

      byte[] responseArray = myWebClient.UploadData(URL, byteinput); 


      string responseString = Encoding.ASCII.GetString(responseArray); 


      return responseString; 
     } 
     catch(Exception ex) 
     {     
      return null; 
     } 
    } 

感谢

回答

-1

的Windows显示应用中丝毫不差,当窗口过程循环(也就是你的主应用程序线程)不处理邮件的未响应的消息。

当您的主应用程序线程忙于某种等待或循环(就像您描述并无法处理Windows消息)时,会发生这种情况。

你有一些选择,因为应用程序无法继续,直到它从服务器获取的响应,你必须选择:

  1. 等待服务器上的第二个线程,让您的应用程序“停止”直到收到响应为止(并且停止了我的意思是处理用户界面,但无法做其他任何事情,例如使用进度条和信号量)。
  2. 不时使用Application.DoEvents()。对于这个工作,你需要能够等待服务器仅一段时间:

while (!initialized) 
{ 
    Application.DoEvents(); 
    initialized = Server.WaitInitialize(1000); 
} 
+1

`DoEvents`很少是这个问题的好答案... – 2009-08-03 10:56:28

8

而不是阻止用户界面,做好这项工作在后台线程(也许BackgroundWorker,也许ThreadPool)。由于它听起来像你想模仿同步,只需禁用的UI控件 - 不要挂表格。然后在从服务器获取响应时更新UI。

0

我会建议实现异步回调。这会让你的应用程序响应。您可以通过webrequest类轻松实现异步回调。