windows phone 不存在多线程?关于Http post 的问题
PostResult函数执行到 _PostDone.Wait();的时候就阻止了GetResponse函数(另外一个线程)的执行,是不是windows phone 不支持多线程呢
ResultData PostResult(MemoryStream stream)
{
//string url = SERVICE_URL + "test/";
string hello = Trace(stream);
stream.Position = 0;
HttpWebRequest request = HttpWebRequest.CreateHttp(SERVICE_URL + "authterm/?termid=1000&digest=1234");
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = stream.Length;
request.Method = "POST";
request.AllowReadStreamBuffering = true;
try
{
request.BeginGetRequestStream((asyncResult) =>
{
byte[] header = System.Text.Encoding.UTF8.GetBytes(hello);
HttpWebRequest postRequest = asyncResult.AsyncState as HttpWebRequest;
Stream streamResult = postRequest.EndGetRequestStream(asyncResult);
//得到响应流
streamResult.Write(stream.ToArray(), 0, (int)stream.Length);
//streamResult.Write(header, 0, header.Length);
streamResult.Flush();
streamResult.Close();
Thread getThread = new Thread(new ParameterizedThreadStart(GetResponse));
getThread.Start(postRequest);
}, request);
_PostDoned.WaitOne();
return new ResultData();
}
catch (WebException ex)
{
return null;
}
}
private void GetResponse(object param)
{
HttpWebRequest postRequest = param as HttpWebRequest;
postRequest.BeginGetResponse((asyncPostResult) =>
{
try
{
HttpWebRequest webRequest = (HttpWebRequest)asyncPostResult.AsyncState;
HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncPostResult);
Stream responseStream = webResponse.GetResponseStream();
DataContractJsonSerializer rspDataSerializer = new DataContractJsonSerializer(typeof(ResultData));
Result = (ResultData)rspDataSerializer.ReadObject(responseStream);
_PostDoned.Set();
}
catch (Exception ex)
{
throw new Exception();
}
}, postRequest);
}
--------------------编程问答-------------------- APM模式的接口被你硬生生的写成这样。。。。。。 --------------------编程问答-------------------- 给你个参考吧
--------------------编程问答-------------------- 哎哟,你跟我写的是一样的,但是不同步,用了个ManualResetEvent _PostDoned.Wait(); 就会把其他的线程都给阻塞了。
public event EventHandler<String> PostCompleted;
private void Post(String postUrl, byte[] postBody)
{
WebRequest webRequest = HttpWebRequest.Create(postUrl);
webRequest.Method = "POST";
webRequest.ContentLength = postBody.Length;
//设置请求头
//webRequest.Headers["xxkey"] = "xxxvalue";
webRequest.BeginGetRequestStream((ar) =>
{
WebRequest request = (WebRequest)ar.AsyncState;
using (Stream postBodyStream = request.EndGetRequestStream(ar))
{
postBodyStream.Write(postBody, 0, postBody.Length);
}
request.BeginGetResponse(EndResponseCallback, request);
}, webRequest);
}
private void EndResponseCallback(IAsyncResult ar)
{
HttpWebRequest request = (HttpWebRequest)ar.AsyncState;
if (request.HaveResponse == false)
{
//通过事件报告错误
return;
}
WebResponse response = request.EndGetResponse(ar);
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
String result = reader.ReadToEnd();
OnPostCompleted(result);
}
}
protected void OnPostCompleted(String e)
{
var postCompletedEventHandler = this.PostCompleted;
if (postCompletedEventHandler == null)
{
return;
}
postCompletedEventHandler(this, e);
}
--------------------编程问答-------------------- 没有问题啊
--------------------编程问答-------------------- windows phone,你同步干嘛?
换个思路吧,非要卡主ui才好? --------------------编程问答-------------------- 我已经把代码改成异步的了,且程序运行没问题,我就是很疑惑这个问题,windows phone 似乎没有真正意义上的多线程?
--------------------编程问答-------------------- WIN8的布置的能不能行呀 --------------------编程问答--------------------
我们的目的是异步,多线程只是实现异步的一种方式。
可以这么说,这种begin\end的APM模型内部就是多线程,由系统来维护的一个线程池来做的。
WP中你可以使用thread的,但是阻塞的方法内部就没实现(记得翻源码的时候看到的,不是很确定),你想了解更多就去反编译下源码查查就明白了 --------------------编程问答-------------------- 微软的SDK的一个特点就是,他认为他能做的,就不需要你来做,也不允许你去做。 --------------------编程问答-------------------- 哈哈,厉害,长知识了。。
微软的SDK的一个特点就是,他认为他能做的,就不需要你来做,也不允许你去做。
补充:移动开发 , Windows Phone