简体   繁体   English

异步请求仅工作一次

[英]Async request only works once

I've followed this code to make Async Requests to my server, however, I only get a String response once, when I call it the next time the whole thing runs, but rs.RequestData.ToString() is empty. 我已经按照以下代码向服务器发出了异步请求,但是,当我下次运行整个事件时,我只得到一次String响应,但是rs.RequestData.ToString()为空。 What do I need to change to get this to work? 我需要进行哪些更改才能使其正常工作?

Here's my code 这是我的代码

    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();
    }    

See my answer 看我的答案

Adding allDone = new ManualResetEvent(false); 添加allDone = new ManualResetEvent(false); at the start of MakeWebRequest() fixed the problem 在MakeWebRequest()开始时解决了该问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM