3

我再次遇到了 PCL(可移植类库)中的 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。我已经等了两分钟多,应该会抛出一个TimeOutException(我认为),但即便如此,什么也没发生。

我测试过:

  • 控制台应用程序(工作)
  • WP8 WXGA 模拟器(不工作)
  • WP8 设备已连接(不起作用)
  • WP8 设备已断开连接(不起作用)

对于我的 PCL,我的目标是:

  • SL4 及更高版本
  • WP7 及更高版本
  • Windows 商店
  • .NET 4.5

我怎么能解决这个问题?PCL不是用来保证交叉兼容性的吗?

4

1 回答 1

2

Windows Phone(和 Silverlight,我认为)明确阻止您等待 UI 线程上的网络操作的结果。您需要将线程的控制权返回给调用者 - 如果您尝试阻止它,那么您将死锁。

最简单的方法是使用 Tasks 和 async/await。我们发布了一个Async Targeting Pack,它将这种支持添加到您所针对的平台(以及针对它们的可移植类库)。请注意,不支持 Windows Phone 7.0,您需要选择 Windows Phone 7.1/7.5(这是同一件事,但不同地方使用不同的版本号)。

于 2012-12-13T00:49:52.423 回答