我正在开发一个控制台应用程序,它获取视频数据的端点列表,发出 HTTP 请求,并将结果保存到文件中。这些是相对较小的视频。由于我无法控制的问题,其中一个视频是very大(145 分钟而不是几秒)。
我看到的问题是,在调用该请求后,我的内存使用量激增至约 1 GB,并且最终收到“任务已取消”错误(可能是因为客户端超时)。这很好,我不想要这个视频,但令人担忧的是,无论我做什么,我分配的内存仍然很高。我希望能够释放内存。任务管理器在这次调用之前显示 ~14 MB 内存使用量,然后不断增加,这似乎令人担忧。在 VS 调试器中我只看到一个尖峰。
我尝试把所有东西都扔进using
声明,重新初始化HttpClient
出现异常时,手动调用GC.Collect()
没有运气。我正在使用的代码看起来像这样:
consumer.Received += async (model, ea) =>
{
InitializeHttpClient(source);
...
foreach(var item in queue)
{
await SaveFileFromEndpoint(url, fileName);
...
}
}
和方法:
public void InitializeHttpClient(string source)
{
...
_client = new HttpClient();
...
}
public async Task SaveFileFromEndpoint(string endpoint, string fileName)
{
try
{
using (HttpResponseMessage response = await _client.GetAsync(endpoint))
{
if (response.IsSuccessStatusCode)
{
using(var content = await response.Content.ReadAsStreamAsync())
using (var fileStream = File.Create($"{fileName}"))
{
await response.Content.CopyToAsync(fileStream);
}
}
}
}
catch (Exception ex)
{
}
}
这是我的调试器输出:
我想我对所看到的有几个问题:
- 我看到的内存使用情况实际上是一个问题吗?
- 有什么方法可以释放大型 HTTP 请求分配的内存吗?
- 有什么方法可以在进行调用和分配内存之前查看请求的内容长度吗?到目前为止,我还没有找到一种方法可以在分配实际内存之前找出情况。
在此先感谢您的帮助!
如果你使用HttpClient.SendAsync(HttpRequestMessage, HttpCompletionOption)代替GetAsync
,你可以提供HttpCompletionOption.ResponseHeadersRead,(与默认的ResponseContentRead
)。这意味着响应流将在响应正文下载之前(而不是下载之后)交还给您,并且操作所需的缓冲区将显着减少。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)