相关疑难解决方法(0)

如果.NET中的MemoryStream未关闭,是否会创建内存泄漏?

我有以下代码:

MemoryStream foo(){
    MemoryStream ms = new MemoryStream();
    // write stuff to ms
    return ms;
}

void bar(){
    MemoryStream ms2 = foo();
    // do stuff with ms2
    return;
}
Run Code Online (Sandbox Code Playgroud)

我分配的MemoryStream是否有可能以后不能被处理掉?

我有一个同行评审坚持我手动关闭它,我找不到信息来判断他是否有一个有效点.

.net c# memory-leaks memorystream

108
推荐指数
6
解决办法
7万
查看次数

Using语句中的MemoryStream - 我是否需要调用close()

在using语句中使用内存流时,是否需要调用close?例如这里需要ms.Close()吗?

  using (MemoryStream ms = new MemoryStream(byteArray)) 
    {  
      // stuff 

      ms.Close(); 
    }
Run Code Online (Sandbox Code Playgroud)

c# memorystream using using-statement

35
推荐指数
2
解决办法
3万
查看次数

如何强制MemoryStream占用释放内存?

我有以下代码:

const int bufferSize = 1024 * 1024;
var buffer = new byte[bufferSize];
for (int i = 0; i < 10; i++)
{
    const int writesCount = 400;
    using (var stream = new MemoryStream(writesCount * bufferSize))
    {
        for (int j = 0; j < writesCount; j++)
        {
            stream.Write(buffer, 0, buffer.Length);
        }
        stream.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在32位机器上运行.

第一次迭代完成就好了,然后下一个迭代我收到了System.OutOfMemoryException关于该行例外newS中MemoryStream.

MemoryStream尽管有using声明,为什么以前的记忆没有被收回?我如何强制释放所使用的内存MemoryStream

.net c# garbage-collection memory-management idisposable

14
推荐指数
1
解决办法
8626
查看次数

如何使.Net web-API能够接受g-ziped帖子

我有一个相当重要的标准.net MVC 4 Web API应用程序.

 public class LogsController : ApiController
{

    public HttpResponseMessage PostLog(List<LogDto> logs)
    {
        if (logs != null && logs.Any())
        {
            var goodLogs = new List<Log>();
            var badLogs = new List<LogBad>();

            foreach (var logDto in logs)
            {
                if (logDto.IsValid())
                {
                    goodLogs.Add(logDto.ToLog());
                }
                else
                {
                    badLogs.Add(logDto.ToLogBad());
                }
            }

            if (goodLogs.Any())
            {
                _logsRepo.Save(goodLogs);
            }

            if(badLogs.Any())
            {
                _logsBadRepo.Save(badLogs);
            }


        }
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
}
Run Code Online (Sandbox Code Playgroud)

这一切都很好,我有能够发送他们的日志的设备,它运作良好.但是现在我们开始担心要传输的数据的大小,我们想看一下接受使用GZIP压缩的帖子?

我该怎么做呢?是在IIS中设置还是我可以使用Action Filters?

编辑1

跟着菲利普的回答,我的想法是我需要在它到达我的控制器之前拦截请求的处理.如果我可以在Web api框架尝试将请求的主体解析到我的业务对象之前捕获请求,该请求失败,因为请求的主体仍然被压缩.然后我可以解压缩请求的主体,然后将请求传递回处理链,希望Web Api框架能够将(解压缩的)主体解析为我的业务对象.

它看起来像使用DelagatingHandler是要走的路.它允许我在处理期间,但在我的控制器之前访问请求.所以我尝试了下面这个?

 public class gZipHandler : DelegatingHandler
{

    protected override …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-web-api

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

我需要关闭这个内存流吗?

我有这个有效的代码:

public async Task<IActionResult> OnGet()
{
    var workbook = GenerateClosedXMLWorkbook();
    MemoryStream memoryStream = new MemoryStream();
    workbook.SaveAs(memoryStream);
    memoryStream.Position = 0;
    return File(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "hello.xlsx");
    }


private XLWorkbook GenerateClosedXMLWorkbook()
{
    var workbook = new XLWorkbook();
    var worksheet = workbook.Worksheets.Add("Sample Sheet");
    worksheet.Cell("A1").Value = "Hello World!";
    worksheet.Cell("A2").FormulaA1 = "=MID(A1, 7, 5)";
    return workbook;
}
Run Code Online (Sandbox Code Playgroud)

但是,在我看来,我需要以某种方式关闭或处理 memoryStream。那是对的吗?还是会自动关闭?

c# asp.net-core asp.net-core-2.0

4
推荐指数
1
解决办法
1537
查看次数