仅当插入断点时,异步代码才似乎有效

时间:2018-10-17 17:43:35

标签: c# asynchronous breakpoints

我有以下C#代码:

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

当我在第一条语句之前插入断点然后继续执行程序时,代码可以正常工作,并且流中存储了超过4 MB的数据。

但是,如果我在没有任何断点的情况下运行程序,或者在上面显示的第一条语句之后插入断点,则代码将运行,但是流中没有数据或仅存储4 KB数据。

有人可以解释为什么会这样吗?

编辑: 这是我在程序中尝试做的事情。我使用几个HttpClient.PostAsync请求来获取一个uri以下载wav文件。然后,我想将wav文件下载到内存流中。我还不知道有其他方法可以做到这一点。

1 个答案:

答案 0 :(得分:0)

似乎您基本上在弄乱asyncawait的流程。

使用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);
}