2014-02-27 119 views
0

我已經跟着this code向我的服務器發出異步請求,但是,我只收到一次字符串響應,當我下次整個事情運行時調用它,但rs.RequestData.ToString()爲空。爲了實現這個目標,我需要改變什麼?異步請求只能工作一次

這裏是我的代碼

public class RequestState 
    { 
     const int BufferSize = 1024; 
     public StringBuilder RequestData; 
     public byte[] BufferRead; 
     public WebRequest Request; 
     public Stream ResponseStream; 
     // Create Decoder for appropriate enconding type. 
     public Decoder StreamDecode = Encoding.UTF8.GetDecoder(); 

     public RequestState() 
     { 
      BufferRead = new byte[BufferSize]; 
      RequestData = new StringBuilder(String.Empty); 
      Request = null; 
      ResponseStream = null; 
     } 
    } 

    public static ManualResetEvent allDone = new ManualResetEvent(false); 
    const int BUFFER_SIZE = 1024; 

    private void MakeWebRequest() 
    { 
     Console.WriteLine("Making request"); 
     // Get the URI from the command line. 
     Uri httpSite = new Uri("my url"); 
     // Create the request object. 
     WebRequest wreq = WebRequest.Create(httpSite); 

     // Create the state object. 
     RequestState rs = new RequestState(); 
     // Put the request into the state object so it can be passed around. 
     rs.Request = wreq; 
     // Issue the async request. 
     IAsyncResult r = (IAsyncResult)wreq.BeginGetResponse(new AsyncCallback(RespCallback), rs); 
     // Wait until the ManualResetEvent is set so that the application 
     // does not exit until after the callback is called. 
     allDone.WaitOne(); 
     Console.WriteLine(rs.RequestData.ToString()); 
     Console.WriteLine("RequestData.ToString()"); 
    } 

    private static void RespCallback(IAsyncResult ar) 
    { 
     // Get the RequestState object from the async result. 
     RequestState rs = (RequestState)ar.AsyncState; 

     // Get the WebRequest from RequestState. 
     WebRequest req = rs.Request; 

     // Call EndGetResponse, which produces the WebResponse object 
     // that came from the request issued above. 
     WebResponse resp = req.EndGetResponse(ar); 

     // Start reading data from the response stream. 
     Stream ResponseStream = resp.GetResponseStream(); 

     // Store the response stream in RequestState to read 
     // the stream asynchronously. 
     rs.ResponseStream = ResponseStream; 

     // Pass rs.BufferRead to BeginRead. Read data into rs.BufferRead 
     IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead, 0, 
      BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs); 
    } 


    private static void ReadCallBack(IAsyncResult asyncResult) 
    { 
     // Get the RequestState object from AsyncResult. 
     RequestState rs = (RequestState)asyncResult.AsyncState; 

     // Retrieve the ResponseStream that was set in RespCallback. 
     Stream responseStream = rs.ResponseStream; 

     // Read rs.BufferRead to verify that it contains data. 
     int read = responseStream.EndRead(asyncResult); 
     if (read > 0) 
     { 
      // Prepare a Char array buffer for converting to Unicode. 
      Char[] charBuffer = new Char[BUFFER_SIZE]; 

      // Convert byte stream to Char array and then to String. 
      // len contains the number of characters converted to Unicode. 
      int len = 
       rs.StreamDecode.GetChars(rs.BufferRead, 0, read, charBuffer, 0); 

      String str = new String(charBuffer, 0, len); 

      // Append the recently read data to the RequestData stringbuilder 
      // object contained in RequestState. 
      rs.RequestData.Append(
       Encoding.ASCII.GetString(rs.BufferRead, 0, read)); 

      // Continue reading data until 
      // responseStream.EndRead returns –1. 
      IAsyncResult ar = responseStream.BeginRead(
       rs.BufferRead, 0, BUFFER_SIZE, 
       new AsyncCallback(ReadCallBack), rs); 
     } 
     else 
     { 
      if (rs.RequestData.Length > 0) 
      { 
       // Display data to the console. 
       string strContent; 
       strContent = rs.RequestData.ToString(); 
      } 
      // Close down the response stream. 
      responseStream.Close(); 
      // Set the ManualResetEvent so the main thread can exit. 
      allDone.Set(); 
     } 
     return; 
    } 

    //Button click method 
    private void MakeWebClick(object sender, RoutedEventArgs e) 
    { 
     MakeWebRequest(); 
    }  

見我的回答

+2

請在您的主帖的代碼。網址中斷:) – Codeman

+0

你*有*使用'BeginXXX/EndXXX'模式嗎?你的目標是.NET 3.5嗎?否則,你可以使用'Task.FromAsync':http://stackoverflow.com/a/21346870/1768303 – Noseratio

回答

1

在MakeWebRequest開始添加allDone = new ManualResetEvent(false);()解決了這一問題