C# HttpClient中的OutOfMemory异常

C# HttpClient中的OutOfMemory异常,c#,httpclient,C#,Httpclient,遇到未处理的OutOfMemory异常 using(var httpclient = new HttpClient(httpClientHandler)) { httpclient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip")); httpclient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQ

遇到未处理的OutOfMemory异常

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;
}
我真的不知道该怎么办,或者具体原因是什么,我相信这与“wait response.Content.ReadAsStringAsync()有关

有人建议使用

  ReadAsStreamAsync();
但是,我需要将其作为字符串输出到“源”,以便在另一个函数中分析数据

我还想补充一点,我正在运行线程

有可能吗

Response.Content

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

建议的解决方案是正确的。应用程序所在的操作系统内存似乎没有足够的内存。为了解决此问题,明智的做法是编写stream作为文件到磁盘而不是内存。
transferncodingchunked
也可能有帮助,但发送方需要支持它

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

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

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

您可能需要阅读“分块传输”:@HereticMonkey将研究感谢您可能还需要阅读是否适合立即
处置
您的
HttpClient
,就像您使用
语句处理
一样。一般的共识是“是的,它们是一次性的,但是,真的,你想把它们保留很长一段时间,重新使用它们。”关于这一点,有很多讨论(在某某和其他地方)。你可能想读一读“分块传输”“:@HereticMonkey将查看感谢您可能还想了解一下是否适合立即
Dispose
您的
HttpClient
,就像您使用
语句处理
一样。普遍的共识是“是的,它们是一次性的,但是,真的,你想长期保留它们,重新使用它们”。关于这一点(在某某和其他地方)有很多讨论。