异步请求与MonoTouch
本文关键字:MonoTouch 请求 异步 | 更新日期: 2023-09-27 18:17:42
我试图在我的MonoTouch应用程序中执行异步请求。当我执行下面的代码时,它的行为就像请求开始一样,但它似乎永远不会返回。我做错了什么?
private void StartAsyncRequest()
{
try
{
// Asynchronously execute the query using HttpWebRequest
string url = GetUrl();
WebRequest request = WebRequest.Create(url);
request.BeginGetResponse(new AsyncCallback(AsyncAttempt_Completed), request);
}
catch (Exception ex)
{
// Show error message here.
}
}
private void AsyncAttempt_Completed(IAsyncResult result)
{
try
{
// 1. Get the response from the service call
WebRequest request = (WebRequest)(result.AsyncState);
using (WebResponse response = request.EndGetResponse(result))
{
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string temp = reader.ReadToEnd();
// Show temp value here.
}
}
}
catch (Exception ex)
{
// Show error message here.
}
}
谢谢!
除非您有非常特定的需求,否则我强烈建议您使用WebClient
而不是WebRequest
。这将自动为您处理许多事情,并且(在大多数情况下)将更好地进行wrt内存管理。
。上面的大部分代码可以替换为DownloadStringAsync
否则你的代码看起来很好。事实上,我在一个MonoTouch应用程序内执行它,它运行没有问题(一旦GetUrl
被替换),你的回调是调用。
然而,你的注释,而不是你的代码,让我怀疑调用是否成功网络智能,但失败ui智能。例如
// Show temp value here.
异步回调将在另一个线程上调用。像大多数现有的UI工具包一样,UIKit要求所有与UI相关的操作都在主(UI)线程上完成。不这样做会给你带来很多痛苦。
你可以使用InvokeOnMainThread
确保UI(或其他)代码在主线程上执行。