异步下载字符串,UI 短暂冻结
Downloading a string asynchronously, UI freezes briefly
我正在编写 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
}
谢谢,
科林
使用 async/await,您需要一直异步。因此,您也应该将 LatestRecipes 方法更改为异步的。
public async Task<RecipesView> LatestRecipesAsync(string searchTerm, long? fromTimestamp, int recordsPerPage, bool hasMoreRecords)
{
// ... Your existing code ...
string result = await DownloadString (queryUrl, handler);
// ... The rest of your code ...
}
此外,异步方法的推荐约定是在名称后缀 Async。
我正在编写 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
}
谢谢, 科林
使用 async/await,您需要一直异步。因此,您也应该将 LatestRecipes 方法更改为异步的。
public async Task<RecipesView> LatestRecipesAsync(string searchTerm, long? fromTimestamp, int recordsPerPage, bool hasMoreRecords)
{
// ... Your existing code ...
string result = await DownloadString (queryUrl, handler);
// ... The rest of your code ...
}
此外,异步方法的推荐约定是在名称后缀 Async。