C#异步调用的代码如下:public class DataRequest
{
    public string paramData=string.Empty;//请求参数
    public string resData=string.Empty;//返回值
    public HttpStatusCode statusCode;//状态记录
    public Exception errorAsync;//记录异步函数中的错误
    public static Encoding dataEncode = Encoding.UTF8;//字符编码方式为UTF8
    public void RequestURL(string url)
    {
        HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(url));
        webReq.Method = "POST";
        webReq.ContentType = "application/x-www-form-urlencoded";
        webReq.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), webReq);
    }
    private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
            Stream postStream = request.EndGetRequestStream(asynchronousResult);
            byte[] byteArray = dataEncode.GetBytes(paramData);
            postStream.Write(byteArray, 0, byteArray.Length);
            postStream.Close();
            request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
        }
        catch (Exception ee)
        {
            errorAsync = ee;
         }
    }
    private void GetResponseCallback(IAsyncResult asynchronousResult)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
            Stream streamResponse = response.GetResponseStream();
            StreamReader streamRead = new StreamReader(streamResponse);
            statusCode=response.StatusCode;
            resData = streamRead.ReadToEnd();
            streamResponse.Close();
            streamRead.Close();
        }
        catch (Exception ee) 
        {
             errorAsync = ee;
        }
    }
}可是通过MessageBox.Show()看到的状态码却为0,也就是状态码是空值,代码如下:DataRequest request = new DataRequest();
username = System.Net.HttpUtility.UrlEncode(username);
password = MD5CryptoServiceProvider.GetMd5String(password);
request.paramData = @"EMAIL=" + username + @"&PASSWORD=" + password + @"&debug=";
request.RequestURL(baseUrl + "login.php");
MessageBox.Show(request.statusCode.ToString());这是什么原因?我该如何看到状态码?

解决方案 »

  1.   

    streamRead.ReadToEnd (你的这个阻塞读数据的语句)开始之后才真正去读对方的数据。如果你只是需要状态码,那么使用你的streamRead读取100个字节的信息就够了,不需要读取所有的返回数据。
      

  2.   

    换句话说,你把 statusCode=response.StatusCode; 这条语句后移一行就行了。
      

  3.   

    照您说的改了,看到的还是0而不是OK:private void GetResponseCallback(IAsyncResult asynchronousResult)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
            Stream streamResponse = response.GetResponseStream();
            StreamReader streamRead = new StreamReader(streamResponse);                
            resData = streamRead.ReadToEnd();
            statusCode = response.StatusCode;
            streamResponse.Close();
            streamRead.Close();
        }
        catch (Exception ee)
        {
             errorAsync = ee;
         }
    }我这是个WindowsPhone程序,会不会跟普通的C#不同呢?
      

  4.   

    原来那个回调函数没有开启新的线程,仍然是由UI的线程来负责处理的.HttpWebRequest是基于后台进程运行的,回调不是UI线程,所以不能直接对UI进行操作,通常使用Dispatcher.BeginInvoke()跟界面进行通讯。Notify的 Signal是全局信号量,是线程安全的.API的请求使用异步的,得到数据后存起来,然后发信号给等待的UI线程.基本是这么个思路