异步HttpWebRequest不异步?

手抓饼加辣 2010-05-14 04:46:13
看代码,问题在代码中:
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());
}
...全文
582 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingyuebuyu 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 a6230589 的回复:]
引用 3 楼 a6230589 的回复:

引用 2 楼 bbbbbb888888 的回复:

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

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

谢谢,你的这个方法对我很有……
[/Quote]


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());
}
}
}
手抓饼加辣 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mngzilin 的回复:]

一塌糊涂

Stream reqStream = request.GetRequestStream();

你这是干什么呢?
[/Quote]
您好,谢谢您的留言。我的这段代码有什么问题请您指出来好么?我先解释一下我自己这段代码的意思:
Stream reqStream = request.GetRequestStream();、
由于我使用post方式提交,所以要向服务端发送键值对,所以要得到客户端发送给服务端的流,将键值对用utf-8格式转换后发给服务端,请问,这有什么问题么?
手抓饼加辣 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 a6230589 的回复:]

引用 2 楼 bbbbbb888888 的回复:

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

呵呵,我试过了,还是没用。难道BeginGetResponse 真的还是同步?
[/Quote]
谢谢,你的这个方法对我很有启发,我试了,但是两次都打印出“thread id 1”,这是否说明真的是同步?
手抓饼加辣 2010-05-15
  • 打赏
  • 举报
回复
xingyuebuyu,谢谢。今天研究了一上午,我也发现当我用get方式请求客户端的时候是异步,但是post方式就不是,后来研究发现,使用post方式的时候,要将request.GetRequestStream()改成request.BeginGetRequestStream();才能实现异步,结贴,谢谢你了。
mngzilin 2010-05-14
  • 打赏
  • 举报
回复
一塌糊涂

Stream reqStream = request.GetRequestStream();

你这是干什么呢?
zming 2010-05-14
  • 打赏
  • 举报
回复

这是使用 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 里
}

xingyuebuyu 2010-05-14
  • 打赏
  • 举报
回复
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());
手抓饼加辣 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bbbbbb888888 的回复:]

看样子像异步的时候Console.write不一定那个在前面显示,在Completed中加个 Thread.Sleep(5000);
看看会比较明显.并且和CPU也有关系吧.
[/Quote]
呵呵,我试过了,还是没用。难道BeginGetResponse 真的还是同步?
bbbbbb888888 2010-05-14
  • 打赏
  • 举报
回复
看样子像异步的时候Console.write不一定那个在前面显示,在Completed中加个 Thread.Sleep(5000);
看看会比较明显.并且和CPU也有关系吧.
皇城龙三 2010-05-14
  • 打赏
  • 举报
回复

110,590

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧