【发布时间】:2015-03-22 18:31:53
【问题描述】:
我正在编写一个 Xamarin.Forms 应用程序,但在使用异步发出请求时遇到了一些问题。当确实不应该发出网络请求时,它会暂时冻结。我做错了什么?
public RecipesView LatestRecipes
(string searchTerm, long? fromTimestamp, int recordsPerPage, bool hasMoreRecords)
{
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = Settings.cookies;
string url = Settings.Default.baseUrl + "/Api/recipes/latest";
Dictionary<string, string> queryString = new Dictionary<string, string> ();
queryString.Add ("maxRecords", recordsPerPage.ToString());
queryString.Add ("searchTerm", searchTerm);
queryString.Add ("username", "");
queryString.Add ("boardSlug", "");
queryString.Add ("type", "json");
string queryUrl = url + ToQueryString(queryString);
string result = DownloadString (queryUrl, handler).Result;
RecipesView view = JsonConvert.DeserializeObject<RecipesView> (result);
hasMoreRecords = view.HasMoreRecords;
foreach (RecipeModel model in view.Records) {
model.OriginalImageWidth = model.ImageWidth;
model.OriginalImageHeight = model.ImageHeight;
}
return view;
}
public async Task<string> DownloadString(string url, HttpClientHandler handler)
{
var httpClient = new HttpClient(handler); // Xamarin supports HttpClient!
Task<string> contentsTask = httpClient.GetStringAsync(url); // async method!
// await! control returns to the caller and the task continues to run on another thread
string contents = await contentsTask;
return contents; // Task<TResult> returns an object of type TResult, in this case int
}
谢谢, 科林。
【问题讨论】:
-
您对 DownloadString 的消费不是异步的。调用 .Result 正在等待任务完成。
标签: .net asynchronous xamarin xamarin.forms