gpt4 book ai didi

c# - WP8 上的 HttpWebRequest.BeginGetResponse

转载 作者:行者123 更新时间:2023-11-30 17:08:19 24 4
gpt4 key购买 nike

我再次遇到 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) 调用它时,它卡在了开始获取响应。它根本不会进入 GetResponseCallback(使用断点进行测试),并且不会在 BeginGetResponse 之后直接继续任何代码。我已经等了两分多钟,应该会抛出一个 TimeOutException(我认为),但即便如此,也什么都没有发生。

我测试了:

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

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

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

我该如何解决这个问题? 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com