WinRT читает бесконечный онлайн поток, зависает

1

Следующий код получает поток из URI и будет считываться в кусках с использованием цикла. Обратите внимание, что за указанным URI используется онлайн-радиопоток, что означает, что неизвестного размера нет.

var uri = new Uri("http://*******", UriKind.Absolute); 
var http = new HttpClient();
var stream = await http.GetStreamAsync(uri);
var buffer = new byte[65536];

while (true)
{
    var read = await stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);

    Debug.WriteLine("Read: {0}", read);
}

Теперь, когда это прекрасно работает в консольном приложении.NET 4.5, этот точно такой же код не работает так, как ожидалось в WinRT, - он будет читать первый фрагмент, а при вызове ReadAsync во второй раз он просто застрянет и никогда не продолжит,

Если я переключу URI на файл (известного размера), все будет хорошо работать в обоих проектах.

Какие-нибудь советы?

EDIT > обратите внимание, что это поведение происходит только на WP8.1. Я просто искал еще что-то в SO и обнаружил, что мой вопрос может быть дубликатом этого: WP8.1 HttpClient Stream получил только 65536 байт данных. Если это правда, я закрою свой вопрос

  • 0
    Я знаю, что это веселый град, но вы пробовали читать более мелкими кусочками?
Теги:
async-await
http
windows-runtime
windows-phone-8.1

2 ответа

2

Используйте HttpClient.GetAsync() с HttpCompletionOption.ResponseHeadersRead. Это возвращается при получении заголовков, затем выполняется HttpResponse.Content.ReadAsInputStreamAsync().

  • 0
    1) HttpResponse.Content не имеет метода ReadAsInputStreamAsync. 2) Когда я использую ReadAsStreamAsync, он имеет такое же поведение, зависает при втором вызове
  • 0
    Да, вы должны использовать пространство имен Windows.Web.Http вместо System.Net.Http . Проверьте этот пример: monkeyweekend.wordpress.com/2015/01/11/…
-3

Похоже, ваш цикл while бесконечен. Как вы гарантируете, что это конечно? Вместо while (true) сделайте что-то вроде этого

var uri = new Uri("http://*******", UriKind.Absolute);
var http = new HttpClient();

var stream = http.GetStreamAsync(uri).Result;

using (var reader = new StreamReader(stream))
{
     while (!reader.EndOfStream)
     {
         var response = reader.ReadToEnd();
     }
}
  • 0
    пожалуйста, прочитайте вопрос снова

Ещё вопросы

Сообщество Overcoder
Наверх
Меню