首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpClient GetAsync悬挂

HttpClient GetAsync悬挂
EN

Stack Overflow用户
提问于 2013-10-25 02:14:48
回答 1查看 10.3K关注 0票数 6

在我的两个WP8应用程序中,我有一个相同的方法。给定相同的url和相同的设备,该方法可以在一个应用程序上工作,而不是在另一个应用程序上工作。在这个失败的应用程序中,GetAsync在被调用后挂起。没有休息,也没有例外。

下面是有争议的方法。

代码语言:javascript
复制
    private async Task<Byte[]> DownloadData(string uri)
    {
        byte[] myDataBuffer = null;
        var newUri = new Uri(uri, UriKind.Absolute);
        var myWebClient = new HttpClient();

        var response = await myWebClient.GetAsync(newUri);
        if (response.Content.Headers.ContentType.MediaType == "text/plain"
            || response.Content.Headers.ContentLength < 200)
        {
            throw new Exception(await response.Content.ReadAsStringAsync());
        }
        myDataBuffer = await response.Content.ReadAsByteArrayAsync();
        return myDataBuffer;
    }

这种情况每次都发生在一个特定的应用上,而不是另一个应用上。同样的装置。有人经历过这种行为吗?网址是有效的,代码是相同的。是否有某个项目设置可能会影响到这一点?我在失败的应用程序的另一部分中使用HttpClient,它在那里工作。

我可以更改代码以使用HttpWebRequest,这很好。只是不是HttpClient。

我刚才发现,如果我将该方法复制到我的button_click处理程序中,它也在那里工作。在单独的类中使用此方法有问题吗?我觉得很奇怪。

更新

似乎正在破坏的是调用它的多层异步方法。在我的课堂上

代码语言:javascript
复制
    public override byte[] GetImageData(string imageUri)
    {
        return GetImageDataAsync(imageUri).Result;
    }

    public async Task<byte[]> GetImageDataAsync(string imageUri)
    {
        return await DownloadData(imageUri);
    }

从我的button_click处理程序,我打电话给GetImageData(uri)。如果我把它改为await GetImageDataAsync(uri),它就能工作了。

Result不是GetImageData中引用的正确属性吗?

这里有一个测试url "logo.gif

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-25 02:52:08

can cause deadlocks,正如我在博客中所解释的。

解决这个问题的正确方法是使用await。我假设您想要同步阻塞是有原因的,但是最好使用await并找到一种方法使它在代码中工作。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19580025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档