我有以下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文件下载到内存流中。我还不知道有其他方法可以做到这一点。
答案 0 :(得分:0)
似乎您基本上在弄乱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);
}