繁体   English   中英

异步等待模式帮助。 我做对了吗?

[英]Async await pattern help. Am I doing it right?

我有一个“ api”(例如存储库模式),我写过从Web返回xml,然后将其合并到类中。

它似乎挂在GetXmlAsync(url)方法的结果上。

public async Task<string> GetXmlAsync(string url)
{
    string xml = string.Empty;

    HttpMessageHandler handler = new HttpClientHandler();
    HttpClient httpClient = new HttpClient(handler);
    Uri uri = new Uri(url, UriKind.Absolute);
    HttpResponseMessage response = await httpClient.GetAsync(uri);

    xml = await response.Content.ReadAsStringAsync();

    return xml;
}

但是,当我在单元测试中使用相同的代码时,它就可以工作。

在应用程序中,我这样称呼它:

public async Task<IEnumerable<Post>> GetRecentAsync(int page)
{
    string url = this.urls.GetRecent(page);
    string xml = string.Empty;

    var xmlTask = this.loader.GetXmlAsync(url);

    xml = xmlTask.Result; // Hangs right here.

    var results = this.modelLoader.XmlToPost(xml);

    if (results.Count() < 1)
    {
        this.LastError = XmlLoadError;
    }

    return results.AsEnumerable();
}

[TestMethod]
public async Task Integration_HttpLoader_GetXmlAsync_GetRecent_Xml_ShouldNotBeNullOrEmpty()
{
    int page = 1;
    string xml = string.Empty;
    IUrl url = this.GetUrlHelper();
    ILoader loader = this.GetIntegrationLoader(false);

    xml = await loader.GetXmlAsync(url.GetRecent(page));

    Assert.IsTrue(!string.IsNullOrEmpty(xml));
}

在您的应用程序中,您不会在等待 athis之前调用this.loader.GetXmlAsync(url)。击中这一行,在另一个线程上触发异步任务,然后立即进行下一行而不得到响应。 它在您的单元测试中有效,因为您正确使用了await关键字。

通过同步阻止任务结果而导致死锁

请遵循以下最佳做法:

  • 不要阻塞async代码(使其一直向下async )。

    例如, var xml = await this.loader.GetXmlAsync(url); GetRecentAsync

  • 如果它们可以在线程池线程上继续,请在您的“库” async方法中使用ConfigureAwait(false)

    例如, var response = await httpClient.GetAsync(uri).ConfigureAwait(false); xml = await response.Content.ReadAsStringAsync().ConfigureAwait(false); GetXmlAsync

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM