异步下载字符串,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。