我再次遇到 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
(我认为),但即便如此,什么也没发生。我测试了:
工作)
对于我的 PCL,我的目标是:
我怎么能解决这个问题? PCL 不是用来保证交叉兼容性的吗?
最佳答案
Windows Phone(我认为还有 Silverlight)明确阻止您在 UI 线程上等待网络操作的结果。您需要将线程的控制权返回给调用者 - 如果您试图阻止它,那么您将死锁。
最简单的方法是使用 Tasks 和 async/await。我们已经发布了一个 Async Targeting Pack,它将这种支持添加到您所针对的平台(以及针对它们的可移植类库)。请注意,不支持 Windows Phone 7.0,您需要选择 Windows Phone 7.1/7.5(这是同一回事,但不同的地方使用不同的版本号)。
关于c# - WP8 上的 HttpWebRequest.BeginGetResponse,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13847862/