【问题标题】:OutOfMemory exception in HttpClientHttpClient 中的 OutOfMemory 异常
【发布时间】:2019-07-15 21:02:45
【问题描述】:

遇到未处理的 OutOfMemoryException。

using(var httpclient = new HttpClient(httpClientHandler))
{
    httpclient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
    httpclient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));

    var request = new HttpRequestMessage(HttpMethod.Post, url);
    request.Content = new FormUrlEncodedContent(parameters);

    var response = await httpclient.SendAsync(request);
    var contents = await response.Content.ReadAsStringAsync();

    var source = contents.ToString();
    return source;
}

我不太确定该怎么做,或者具体原因是什么,我认为这与“等待响应。Content.ReadAsStringAsync();”有关

有人建议使用

  ReadAsStreamAsync();

改为输出到文件,但是我需要作为字符串输出到“源”,以便我可以在另一个函数中分析数据..

我还想添加我正在运行的线程..

有没有可能

Response.Content

即使在完成特定功能后仍被存储在内存中?将内存或内容返回源后是否需要处理/清除内存或内容?

【问题讨论】:

  • @HereticMonkey 会调查一下,谢谢
  • 您可能还想了解一下是否适合立即使用Dispose 您的HttpClient,就像您对using 语句所做的那样。普遍的共识是“是的,它们是一次性的,但是,真的,你想长期使用它们,重复使用它们”。对此有很多讨论(关于 SO 和其他地方)。

标签: c# httpclient


【解决方案1】:

建议的解决方案是正确的。您的应用程序所在的操作系统内存似乎没有足够的内存。为了解决这个问题,将流作为文件写入磁盘而不是内存是明智的。 TransferEncodingChunked 也有帮助,但发件人需要支持。

using (FileStream fs = File.Create("fileName.ext")
{
    ....
    var stream = await response.Content.ReadAsStreamAsync();
    await fs.CopyToAsync(stream);
    fs.Close();
}

【讨论】:

    猜你喜欢
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2018-06-18
    • 2015-04-25
    • 2016-04-26
    • 2014-07-15
    • 1970-01-01
    相关资源
    最近更新 更多