看代码,问题在代码中:
        static void Main()
        {
            //qq号码
            string qqCode = "289699769";
            HttpWebRequest request = WebRequest.Create("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx/qqCheckOnline") as HttpWebRequest;
            request.Method = "post";
            //下面开始设置标头,不能使用request.Headers.Add或者Set方法         
            request.ContentType = "application/x-www-form-urlencoded";
            Stream reqStream = request.GetRequestStream();
            byte[] arr = Encoding.UTF8.GetBytes("qqCode=" + qqCode);
            reqStream.Write(arr, 0, arr.Length);
            reqStream.Close();            Console.ReadLine();
            //从这里开始异步,在这里之前http请求还没有发送出去,在这里将request传进去
            request.BeginGetResponse(new AsyncCallback(Compleate), request);
            //问题是多次测试发现,每次程序运行到这里都必须要等异步请求返回后执行Compleate(IAsyncResult asyncResult)方法后才执行下面的输出语句,这不就和同步没有区别了吗?想了很久,google搜不到我想要的。好久没发帖,大家都一起来参谋下。
            Console.WriteLine("继续");
        }        /// <summary>
        /// 异步操作完成后触发的方法
        /// </summary>
        /// <param name="res"></param>
        static void Compleate(IAsyncResult asyncResult)
        {
            Console.WriteLine("异步完成");
            if (asyncResult == null)
            {
                return;
            }
            HttpWebRequest req = (asyncResult.AsyncState as HttpWebRequest);
            HttpWebResponse res = req.EndGetResponse(asyncResult) as HttpWebResponse;
            StreamReader reader = new StreamReader(res.GetResponseStream());
            Console.WriteLine(reader.ReadToEnd());
        }

解决方案 »

  1.   

    转一下官方的资料吧http://www.microsoft.com/china/msdn/library/webservices/WebApp/se0412NETMatters.mspx?mfr=true异步HttpWebRequest
      

  2.   

    看样子像异步的时候Console.write不一定那个在前面显示,在Completed中加个 Thread.Sleep(5000);
    看看会比较明显.并且和CPU也有关系吧.
      

  3.   

    呵呵,我试过了,还是没用。难道BeginGetResponse 真的还是同步?
      

  4.   

    http://topic.csdn.net/u/20100428/12/eca7a9f3-433e-4825-9ccb-72d906d48745.html
    和这个的情况应该是一样的,在调用BeginGetResponse之前和Compleate方法中分别显示当前的线程ID看是否是一致的Console.WriteLine("thread id " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
      

  5.   


    这是使用 WebClient 异步访问,不知对楼主是否有用。
    {
        WebClient client = new WebClient();
        client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(AsyncDownloadCompleted);
        Uri uri = new Uri(url);
        client.DownloadStringAsync(uri);
    }private void AsyncDownloadCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        // 返回结果在 e.Result 里
    }
      

  6.   

    一塌糊涂 Stream reqStream = request.GetRequestStream();你这是干什么呢?
      

  7.   

    谢谢,你的这个方法对我很有启发,我试了,但是两次都打印出“thread id 1”,这是否说明真的是同步?
      

  8.   

    您好,谢谢您的留言。我的这段代码有什么问题请您指出来好么?我先解释一下我自己这段代码的意思:
     Stream reqStream = request.GetRequestStream();、
    由于我使用post方式提交,所以要向服务端发送键值对,所以要得到客户端发送给服务端的流,将键值对用utf-8格式转换后发给服务端,请问,这有什么问题么?
      

  9.   

    http://topic.csdn.net/u/20100428/12/eca7a9f3-433e-4825-9ccb-72d906d48745.html我在这个里面说了啊
    BeginGetResponse 是异步的,只是说它在获取等待时是异步的,Compleate回调方法是在你获取到响应流后才执行的,看下面的调用完BeginGetResponse 后,就会执行Console.WriteLine("继续 " + DateTime.Now.ToString());
    ,Compleate回调方法是过了一段时间后才开始执行的,因为获取响应是需要时间等待的using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.IO;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {            HttpWebRequest request = WebRequest.Create("http://www.baidu.com") as HttpWebRequest;
                Console.WriteLine("Begin " + DateTime.Now.ToString());
                request.BeginGetResponse(new AsyncCallback(Compleate), request);
                Console.WriteLine("继续 " + DateTime.Now.ToString());
                Console.Read();
            }        static void Compleate(IAsyncResult asyncResult)
            {
                Console.WriteLine("End " + DateTime.Now.ToString());
                Console.WriteLine("异步完成");
                if (asyncResult == null)
                {
                    return;
                }
                HttpWebRequest req = (asyncResult.AsyncState as HttpWebRequest);
                HttpWebResponse res = req.EndGetResponse(asyncResult) as HttpWebResponse;
                StreamReader reader = new StreamReader(res.GetResponseStream());
                Console.WriteLine(reader.ReadToEnd());
            }
        }
    }
      

  10.   

    xingyuebuyu,谢谢。今天研究了一上午,我也发现当我用get方式请求客户端的时候是异步,但是post方式就不是,后来研究发现,使用post方式的时候,要将request.GetRequestStream()改成request.BeginGetRequestStream();才能实现异步,结贴,谢谢你了。