1

Windows Phoneからサーバーにhttp投稿を送信しようとしていますが、投稿データを送信することで問題が発生します。button_click_1関数にブレークポイントを設定しましたが、非同期操作が開始されないことがわかりました。それに加えて、それは現在のスレッドもブロックします、そして私はこの状況がによって引き起こされることを知っていallDone.waitOne()ます。

なぜ非同期演算が機能しないのか、そしてそれをどのように解決するのですか?

助けてくれてありがとう。

private void Button_Click_1(object sender, RoutedEventArgs e)
            {
            // Create a new HttpWebRequest object.
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            request.ContentType = "application/x-www-form-urlencoded";

            request.Method = "POST";

            // start the asynchronous operation
            request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);

            allDone.WaitOne();

        }

非同期操作

private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
        {
            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;


            // End the operation
            Stream postStream = request.EndGetRequestStream(asynchronousResult);

            string postData = "xxxxxxxxxxx";    
            // Convert the string into a byte array. 
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);

            // Write to the request stream.
            postStream.Write(byteArray, 0, postData.Length);
            postStream.Close();

            // Start the asynchronous operation to get the response
            request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
        }

        private void GetResponseCallback(IAsyncResult asynchronousResult)
        {
            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

            // End the operation
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
            Stream streamResponse = response.GetResponseStream();
            StreamReader streamRead = new StreamReader(streamResponse);
            string responseString = streamRead.ReadToEnd();
            tbtesting.Text = responseString.ToString();

            streamResponse.Close();
            streamRead.Close();

            response.Close();
            allDone.Set();
        }
4

1 に答える 1

1

これを最初にヒットしたのはあなたではありません(wpf(Windows Phone)のUIスレッドで同期ネットワーク呼び出しを行うことは可能ですか?を参照)。これを行うと、WindowsPhoneのUIスレッドがデッドロックします。

最も近い方法は、ネットワーク呼び出しでasync/awaitを使用することです。NuGetのMicrosoft.Bcl.Asyncパッケージの一部としてこれを行うために使用できる拡張メソッドがあります。

于 2013-03-26T06:48:07.723 に答える