Асинхронный код работает только тогда, когда вставлена ​​точка останова - PullRequest
0 голосов
/ 17 октября 2018

У меня есть следующий код C #:

var response = client.GetAsync(uri).Result;
MemoryStream stream = new MemoryStream();
response.Content.CopyToAsync(stream);
System.Console.WriteLine(stream.Length);

Когда я вставляю точку останова перед первым оператором, а затем продолжаю программу, код работает нормально, и в потоке сохраняется более 4 МБ данных.

Но если я запускаю программу без каких-либо точек останова или вставляю точку останова после первого оператора, показанного выше, выполняется код, но в потоке не сохраняются данные или только 4 КБ данных.

Может кто-нибудь объяснить, почему это происходит?

Редактировать: Вот что я пытаюсь сделать в своей программе.Я использую пару запросов HttpClient.PostAsync, чтобы получить URI для загрузки файла WAV.Затем я хочу загрузить файл WAV в поток памяти.Я пока не знаю других способов сделать это.

1 Ответ

0 голосов
/ 17 октября 2018

Похоже, что вы в основном путаетесь с потоками async и await.

. Ожидается завершение асинхронного вызова для завершения и повторного захвата задачи при использовании ключевого слова await.

Упомянутый код не уточняет, используете ли вы в своем методе асинхронную подпись или нет.Позвольте мне прояснить решение для вас

Возможное решение 1:

public async Task XYZFunction()
{
  var response = await client.GetAsync(uri); //we are waiting for the request to be completed
  MemoryStream stream = new MemoryStream();
  await response.Content.CopyToAsync(stream); //The call will wait until the request is completed
  System.Console.WriteLine(stream.Length);
} 

Возможное решение 2:

public void XYZFunction()
{
  var response = client.GetAsync(uri).Result; //we are running the awaitable task to complete and share the result with us first. It is a blocking call
  MemoryStream stream = new MemoryStream();
  response.Content.CopyToAsync(stream).Result; //same goes here
  System.Console.WriteLine(stream.Length);
} 
...