看代码,问题在代码中:
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());
}
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());
}
看看会比较明显.并且和CPU也有关系吧.
和这个的情况应该是一样的,在调用BeginGetResponse之前和Compleate方法中分别显示当前的线程ID看是否是一致的Console.WriteLine("thread id " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
这是使用 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 里
}
Stream reqStream = request.GetRequestStream();、
由于我使用post方式提交,所以要向服务端发送键值对,所以要得到客户端发送给服务端的流,将键值对用utf-8格式转换后发给服务端,请问,这有什么问题么?
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());
}
}
}