当前位置:编程学习 > wap >>

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模式的接口被你硬生生的写成这样。。。。。。 --------------------编程问答-------------------- 给你个参考吧

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);
        }
--------------------编程问答-------------------- 哎哟,你跟我写的是一样的,但是不同步,用了个ManualResetEvent _PostDoned.Wait(); 就会把其他的线程都给阻塞了。
引用 2 楼 NianHui 的回复:
给你个参考吧
--------------------编程问答-------------------- 没有问题啊
引用 1 楼 NianHui 的回复:
APM模式的接口被你硬生生的写成这样。。。。。。
--------------------编程问答-------------------- windows phone,你同步干嘛?
换个思路吧,非要卡主ui才好? --------------------编程问答-------------------- 我已经把代码改成异步的了,且程序运行没问题,我就是很疑惑这个问题,windows phone 似乎没有真正意义上的多线程?
引用 5 楼 NianHui 的回复:
windows phone,你同步干嘛?
换个思路吧,非要卡主ui才好?
--------------------编程问答-------------------- WIN8的布置的能不能行呀 --------------------编程问答--------------------
引用 6 楼 solio5 的回复:
我已经把代码改成异步的了,且程序运行没问题,我就是很疑惑这个问题,windows phone 似乎没有真正意义上的多线程?
Quote: 引用 5 楼 NianHui 的回复:

windows phone,你同步干嘛?
换个思路吧,非要卡主ui才好?


我们的目的是异步,多线程只是实现异步的一种方式。

可以这么说,这种begin\end的APM模型内部就是多线程,由系统来维护的一个线程池来做的。

WP中你可以使用thread的,但是阻塞的方法内部就没实现(记得翻源码的时候看到的,不是很确定),你想了解更多就去反编译下源码查查就明白了 --------------------编程问答-------------------- 微软的SDK的一个特点就是,他认为他能做的,就不需要你来做,也不允许你去做。 --------------------编程问答-------------------- 哈哈,厉害,长知识了。。
引用 9 楼 NianHui 的回复:
微软的SDK的一个特点就是,他认为他能做的,就不需要你来做,也不允许你去做。
补充:移动开发 ,  Windows Phone
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,