相关疑难解决方法(0)

HttpClient的内存使用量激增,响应较大

我正在使用一个控制台应用程序,该应用程序将视频数据的端点列表包含在内,发出一个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)

.net c# memory asp.net memory-leaks

5
推荐指数
2
解决办法
1164
查看次数

HttpClient.GetStreamAsync() 与自定义请求?

我的目标是使用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

3
推荐指数
1
解决办法
3967
查看次数

使用 HTTPCLient 下载文件时减少内存占用

我想知道是否有一种方法可以避免获取所有缓冲区,然后使用 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)

对于相当大的文件,应用程序内存增长得非常快。

.net c# stream async-await dotnet-httpclient

3
推荐指数
1
解决办法
1257
查看次数