【问题标题】:HttpClient GetAsync hangingHttpClient GetAsync 挂起
【发布时间】:2013-11-03 23:48:55
【问题描述】:

我在两个 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 中引用的正确属性吗?

这是一个测试网址“http://www.rei.com/pix/common/REI_logo.gif

【问题讨论】:

  • .Result 阻塞,直到 Task 返回一个值。 “异步”不是问题,而是您的代码故意阻塞。无论如何,大多数 MVVM 框架都可以处理异步方法,因此您不需要调用 .Result。你用的是什么框架?

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


【解决方案1】:

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

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

【讨论】:

  • 对,你可以看到我在 GetImageDataAsync 上使用 await。我正在使用的接口定义了非异步GetImageData,所以我认为我会很聪明并从中调用我的异步版本,但这就是它爆炸的地方。
  • @earthling 如果你确实需要一个同步版本,那么像return Task.Run(() =&gt; GetImageDataAsync(imageUri)).Result; 这样的东西应该可以工作。但它否定了使用异步方法的所有优点,这就是为什么它不是一个好主意(尤其是在 GUI 应用程序中,这可能会使 UI 冻结一段时间)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多