我正在使用一个控制台应用程序,该应用程序将视频数据的端点列表包含在内,发出一个HTTP请求,并将结果保存到文件中。这些是相对较小的视频。由于我无法控制的问题,其中一个视频非常大(145分钟而不是几秒钟)。
我看到的问题是,在调用该请求后,我的内存使用量猛增至〜1 GB,最终出现“任务已取消”错误(可能是因为客户端超时)。很好,我不想要这部影片,但有关的是,无论我做什么,我分配的内存都保持很高。我希望能够释放内存。似乎与此有关的是,任务管理器显示〜14 MB的内存使用量,然后此后不断增加。在VS调试器中,我只是看到一个峰值。
我尝试将所有内容都放入一条using语句中,重新初始化HttpClienton异常,但GC.Collect()没有运气手动调用。我正在使用的代码如下所示:
consumer.Received += async (model, ea) =>
{
InitializeHttpClient(source);
...
foreach(var item in queue)
{
await SaveFileFromEndpoint(url, fileName);
...
}
}
Run Code Online (Sandbox Code Playgroud)
和方法:
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);
} …Run Code Online (Sandbox Code Playgroud) 我的目标是使用HttpClient该类进行网络请求,以便我可以将响应写入文件(解析后)。因此我需要将结果作为Stream.
HttpClient.GetStreamAsync()仅将字符串requestUri作为参数。所以不可能用 custom HttpRequestHeader、 custom HttpMethod、 custom ContentType、 custom content 等来创建请求?
我看到HttpWebRequest有时会使用它,但在我的 PCL(Profile111)中没有Add用于Headers. 那么我可以使用HttpClient,我应该使用HttpWebRequest还是应该使用另一个类/库?
c# stream portable-class-library dotnet-httpclient xamarin.forms
我想知道是否有一种方法可以避免获取所有缓冲区,然后使用 HttpClient 和 File.WriteAllBytes 将它们写入文件。
这是我使用的代码片段
public async Task<byte[]> DownloadAsByteArray(string filename)
{
_logger.LogDebug($"Start downloading {filename} file at {DateTime.Now}");
var result = await _httpClient.GetByteArrayAsync(filename);
return result;
}
Run Code Online (Sandbox Code Playgroud)
var bytes = await _downloadFileService.DownloadAsByteArray(fileDownload);
await File.WriteAllBytesAsync(fullFlePathName, bytes);
Run Code Online (Sandbox Code Playgroud)
对于相当大的文件,应用程序内存增长得非常快。