3

PCL (Portable Class Library) の WebRequest でまた問題が発生しました。

私はこのコードを持っています:

    static ManualResetEvent allDone = new ManualResetEvent(false);
    static string doc;

    static public void AddAnime(string encodedLogin, string id, int episodes, int status, int score)
    {
        if (string.IsNullOrEmpty(encodedLogin))
        {
            throw new ArgumentException();
        }
        else
        {   
            doc = String.Format("anime_id={0}&status={1}&episodes={2}&score={3}", id, "watching", episodes, score);

            HttpWebRequest request = HttpWebRequest.CreateHttp("http://mal-api.com/animelist/anime");

            request.Method = "POST";
            request.Headers["Authorization"] = encodedLogin;

            request.BeginGetRequestStream(new AsyncCallback(GetRequestCallBack), request);

            allDone.WaitOne();

            s.ToString();
        }
    }

    static private void GetRequestCallBack(IAsyncResult aResult)
    {
        HttpWebRequest request = (HttpWebRequest)aResult.AsyncState;

        Stream postStream = request.EndGetRequestStream(aResult);

        byte[] byteArray = Encoding.UTF8.GetBytes(doc);

        postStream.Write(byteArray, 0, doc.Length);
        postStream.Flush();

        request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
    }

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

        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);

        Stream dataStream = response.GetResponseStream();
        StreamReader streamReader = new StreamReader(dataStream);

        string responseString = streamReader.ReadToEnd();

        //Do something with string here

        allDone.Set();
    }

さて、問題は、AddAnimeサンプルのコンソール アプリを呼び出すと問題なく動作するのに、WP8 デバイスまたはエミュレーター (WXGA) から呼び出すとBeginGetResponse. まったく入力GetResponseCallbackされず (ブレークポイントでテスト済み)、直後のコードも続行されませんBeginGetResponse。私は 2 分以上待っていましTimeOutExceptionた。

私は以下でテストしました:

  • コンソールアプリ (作品)
  • WP8 WXGA エミュレーター (動作しません)
  • WP8 デバイスが接続されています (動作しません)
  • WP8 デバイスが切断されました (動作しません)

私のPCLでは、次をターゲットにしています。

  • SL4以上
  • WP7以降
  • Windows ストア
  • .NET 4.5

どうすればこれを解決できますか?相互互換性を保証するために PCL が使用されていませんか?

4

1 に答える 1

2

Windows Phone (および Silverlight だと思います) では、UI スレッドでのネットワーク操作の結果を待つことを明示的に禁止しています。スレッドの制御を呼び出し元に戻す必要があります。スレッドをブロックしようとすると、デッドロックが発生します。

これを行う最も簡単な方法は、タスクと async/await を使用することです。ターゲットとするプラットフォーム (およびそれらをターゲットとするポータブル クラス ライブラリ) にこのサポートを追加するAsync Targeting Packをリリースしました。Windows Phone 7.0 はサポートされていないことに注意してください。Windows Phone 7.1/7.5 を選択する必要があります (同じことですが、場所によってバージョン番号が異なります)。

于 2012-12-13T00:49:52.423 に答える