积极答复者
如何同步HTTP POST?

问题
-
silverlight只支持异步的线程模型,而从Web访问数据使用http post方法是经常使用的,我希望使用http post从web访问数据,所以使用了如下异步方法:
public static HttpPost Create(Uri uri, string postData) { var result = new HttpPost(); var request = (HttpWebRequest)HttpWebRequest.Create(uri); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.BeginGetRequestStream((streamResult) => { var writer = new StreamWriter(request.EndGetRequestStream(streamResult)); writer.Write(postData); writer.Close(); request.BeginGetResponse((responseResult) => { var response = (HttpWebResponse)request.EndGetResponse(responseResult); var reader = new StreamReader(response.GetResponseStream()); var msg = reader.ReadToEnd(); reader.Close(); result.StreamRecieved(null, new MessageRecievedEventArgs(msg)); }, request); }, request); return result; }
该方法使用一个uri作为post的地址,一个postData作为需要post的内容,方法返回一个自建的HttpPost对象,该对象保存一个StreamRecieved事件,如果Web请求完成,即产生该事件
要知道这是一种典型的异步模型,可以通过事件的方法进行同步,但我可能需要同步作很有HTTP POST,像这样:
但这种办法总是不正常工作,单步调试总是停留在var mrl = new ManualResetEvent(false); HttpPost.Create("http://sdcb.sinaapp.com/game/close_light/data.php", "action=get_map_count&row=5&column=5").StreamRecieved += (o, e) => { count = int.Parse((string)e.Message); mrl.Set(); }; mrl.WaitOne();
var writer = new StreamWriter(request.EndGetRequestStream(streamResult));
这一行代码,请问是为什么?
答案
全部回复
-
<pre lang="x-c#">你好,Daoping Liu,不模拟同步是一切正常的,也就是说,如果将关键代码换成:
var mrl = new ManualResetEvent(false); HttpPost.Create("http://sdcb.sinaapp.com/game/close_light/data.php", "action=get_map_count&row=5&column=5").StreamRecieved += (o, e) => { count = int.Parse((string)e.Message); // mrl.Set(); }; // mrl.WaitOne();
就不会出问题