HttpClient GetAsync挂起

时间:2013-10-25 02:14:48

标签: c# windows-phone-8 async-await

我的两个WP8应用程序中有相同的方法。给定相同的url和相同的设备,该方法适用于一个应用程序,但不适用于另一个应用程序。在失败的应用程序中,GetAsync在调用后挂起。没有时间,没有例外。

这是有问题的方法。

    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处理程序中,它也可以在那里工作。在单独的类中有这个方法有问题吗?这对我来说似乎很奇怪。

更新

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

    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不是正确的属性吗?

这是一个测试网址&#34; http://www.rei.com/pix/common/REI_logo.gif&#34;

1 个答案:

答案 0 :(得分:11)

Calling Result or Wait can cause deadlocks,正如我在博客上解释的那样。

解决此问题的正确方法是使用await。我假设您想要同步阻止某些原因,但最好使用await并找到一种方法使其在您的代码中运行。