本文将带您了解关于如果未关闭.NET中的MemoryStream,是否会造成内存泄漏?的新内容,同时我们还将为您解释未关闭英文怎么写的相关知识,另外,我们还将为您提供关于.NETFileStream文
本文将带您了解关于如果未关闭.NET中的MemoryStream,是否会造成内存泄漏?的新内容,同时我们还将为您解释未关闭英文怎么写的相关知识,另外,我们还将为您提供关于.NET FileStream文件流,StreamReader文本流,MemoryStream内存流几种流的实例、.net – MemoryStream用法导致内存不足异常、.net – 使用FileStreamResult,MemoryStream是如何关闭的?、.net – 可以不配置MemoryStream / StringReader吗?的实用信息。
本文目录一览:- 如果未关闭.NET中的MemoryStream,是否会造成内存泄漏?(未关闭英文怎么写)
- .NET FileStream文件流,StreamReader文本流,MemoryStream内存流几种流的实例
- .net – MemoryStream用法导致内存不足异常
- .net – 使用FileStreamResult,MemoryStream是如何关闭的?
- .net – 可以不配置MemoryStream / StringReader吗?
如果未关闭.NET中的MemoryStream,是否会造成内存泄漏?(未关闭英文怎么写)
我有以下代码:
MemoryStream foo(){ MemoryStream ms = new MemoryStream(); // write stuff to ms return ms;}void bar(){ MemoryStream ms2 = foo(); // do stuff with ms2 return;}
我分配的MemoryStream是否有可能以后无法以某种方式处置?
我有一个同行审查,坚持要求我手动关闭此链接,但我找不到信息来说明他是否有正确的观点。
答案1
小编典典如果某些物品是一次性的,则应始终将其丢弃。您应该using
在bar()
方法中使用一个语句以确保ms2
获取Dispose。
它最终将被垃圾收集器清除,但是调用Dispose始终是一个好习惯。如果在代码上运行FxCop,则会将其标记为警告。
.NET FileStream文件流,StreamReader文本流,MemoryStream内存流几种流的实例
一、FileStream文件流
1.读取数据
1 public class ReadFile
2 {
3 /// <summary>
4 /// 读取文件
5 /// FileMode.Create 创建一个新文件,如果文件已经存在则改写旧文件
6 /// FileMode.CreateNew 创建一个文件,如果文件存在会发生异常,提示文件已经存在
7 /// FileMode.Open 打开文件,如果文件不存在则异常
8 /// FileMode.OpenOrCreate 打开文件,如果文件不存在,则创建一个新的文件并且打开文件
9 /// FileMode.Append 打开现有文件,并且在现有文件内容后面追加,如果文件不存在则异常
10 /// FileMode.Truncate 根据现有操作系统,截取文件里面的内容,如果文件不存在则异常
11 /// </summary>
12 public static void Read(string FilePath)
13 {
14 FileStream fileStream = null;
15 try
16 {
17 fileStream = new FileStream(FilePath, FileMode.Truncate);
18 byte[] bytes = new byte[fileStream.Length];
19 int read = fileStream.Read(bytes, 0, bytes.Length);
20 var result = Encoding.UTF8.GetString(bytes);
21 }
22 catch (Exception e)
23 {
24 if (fileStream != null)
25 {
26 fileStream.Dispose();
27 }
28 Console.WriteLine(e.Message);
29 }
30 finally
31 {
32 if (fileStream != null)
33 {
34 fileStream.Close();
35 fileStream.Dispose();
36 }
37 }
38 }
39 }
2.写入数据
1 public class WriteFile
2 {
3 public static void WriteText(string FilePath,string writeString)
4 {
5 FileStream fileStream = null;
6 try
7 {
8 //根据路径打开文件
9 fileStream = new FileStream(@"C:\Users\Administrator\source\repos\OperatFile\OperatFile\1.txt", FileMode.Append);
10 //把字符串转化成字节
11 byte[] bytes = Encoding.UTF8.GetBytes(writeString);
12 //写入到文件
13 fileStream.Write(bytes, 0, bytes.Length);
14 }
15 catch (Exception e)
16 {
17 if (fileStream != null)
18 {
19 fileStream.Dispose();
20 }
21 Console.WriteLine(e.Message);
22 }
23 finally
24 {
25 //关闭和释放
26 if (fileStream != null)
27 {
28 fileStream.Close();
29 fileStream.Dispose();
30 }
31 }
32 }
33 }
二、StreamReader文本流
1.读取数据
1 public class SteamReadFile
2 {
3 /// <summary>
4 /// 读取文件
5 /// </summary>
6 /// <param name="filePath">文件路径</param>
7 public static void ReadFile(string FilePath)
8 {
9 try
10 {
11 using (StreamReader sr = new StreamReader(FilePath))
12 {
13 var result = sr.ReadToEnd();
14 Console.WriteLine(result);
15 }
16 }
17 catch (Exception e)
18 {
19
20 throw new Exception(e.Message);
21 }
22 }
23 }
2.写入数据
1 public class StreamWriteFile
2 {
3 /// <summary>
4 /// 写入文件
5 /// </summary>
6 /// <param name="FilePath">文件路径</param>
7 /// <param name="WriteString">待写入字符串</param>
8 public static void WriteFile(string FilePath,string WriteString)
9 {
10 try
11 {
12 using (StreamWriter sr = new StreamWriter(FilePath))
13 {
14 sr.WriteLine(WriteString);
15 }
16 }
17 catch (Exception e)
18 {
19 throw new Exception(e.Message);
20 }
21 }
22 }
3.写入日志实例
1 public class LogHelper
2 {
3 /// <summary>
4 /// 文件路径
5 /// </summary>
6 public static string FilePath = @"C:\Users\Administrator\source\repos\OperatFile\OperatFile\Files";
7 static LogHelper()
8 {
9 //判断文件夹是否存在,如果不存在,则重新创建
10 if (!Directory.Exists(FilePath))
11 {
12 Directory.CreateDirectory(FilePath);
13 }
14 }
15 /// <summary>
16 /// 日志写入
17 /// Path.Combine(str1,str2,str3) 把传入的参数拼接起来,然后返回新的字符串
18 /// File.AppendText(fullPath) 根据文件路径,把新写入的内容,拼接到文本后面
19 /// </summary>
20 public static void WriteLog()
21 {
22 try
23 {
24 var sb = BindData();
25 string fullPath = Path.Combine(FilePath, $"{DateTime.Now.ToString("yyyy-MM-dd")}.txt");
26 //判断文件是否存在,如果不存在,则新建文件
27 if (!File.Exists(fullPath))
28 {
29 File.Create(fullPath);
30 }
31 using (StreamWriter sw = File.AppendText(fullPath))
32 {
33 sw.WriteLine(sb.ToString());
34 }
35 }
36 catch (Exception e)
37 {
38 throw new Exception(e.Message);
39 }
40
41 }
42 /// <summary>
43 /// 绑定日志信息
44 /// </summary>
45 /// <returns></returns>
46 private static StringBuilder BindData()
47 {
48 StringBuilder sb = new StringBuilder();
49 DateTime operatDateTime = DateTime.Now;
50 string content = "读写文件功能";
51 string operators = "小明";
52 sb.AppendLine($"操作时间:{operatDateTime}");
53 sb.AppendLine($"操作内容:{content}");
54 sb.AppendLine($"操作人:{operators}");
55 sb.AppendLine("------------------------------------------------------------------------------------------");
56 return sb;
57 }
58 }
三、MemoryStream内存流
1 /// <summary>
2 /// 根据URL读取内容到内存流
3 /// </summary>
4 /// <param name="url"></param>
5 /// <returns></returns>
6 public static string DownLoadByUrl(string url)
7 {
8 string result = string.Empty;
9 MemoryStream ms = null;
10 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
11 HttpWebResponse response = request.GetResponse() as HttpWebResponse;
12 using (var stream = response.GetResponseStream())
13 {
14 byte[] buffer = new byte[response.ContentLength];
15 int actuallyRead = 0, offset = 0;
16 do
17 {
18 actuallyRead = stream.Read(buffer, offset, buffer.Length - offset);
19 offset += actuallyRead;
20
21 } while (actuallyRead > 0);
22 ms = new MemoryStream(buffer);
23 ms.Seek(0, SeekOrigin.Begin);
24 var byteArray = new byte[ms.Length];
25 ms.Read(byteArray, 0, byteArray.Length);
26 result = Encoding.UTF8.GetString(byteArray);
27 }
28 response.Close();
29 response.Dispose();
30 return result;
31 }
.net – MemoryStream用法导致内存不足异常
例:
For Each XImage As XImage In pdfDocument.Pages(pageCount).Resources.Images Dim imagestream As New MemoryStream() XImage.Save(imagestream,System.Drawing.Imaging.ImageFormat.Jpeg) ' some further processing imagestream.Close() imagestream.dispose() Next
这段代码循环显示PDF文件页面上的图像.该文件最多可包含500页,每页可写5张图像.它导致数千次迭代.问题是MemoryStream没有被释放,导致Out of Memory异常. XImage通常大约为250 kB.
我在这里使用Aspose.PDF库来处理PDF(XImage是这个库中的一个类),但没关系.我试着做一个简单的例子,我只是创建一个新的MemoryStream并将虚拟位图保存到它.它导致了同样的问题.
我也尝试使用FileStream而不是MemoryStream,但它的行为相同.
任何帮助赞赏.
谢谢
吉日
未释放的是您以前由该内存占用的应用程序中的地址空间.您的计算机可以使用大量的ram,但是您的特定应用程序崩溃了,因为它无法在其地址表中找到位置以进行分配.
您达到限制的原因是MemoryStream在其增长时回收其缓冲区.它在内部使用byte []来保存其数据,并且默认情况下将数组初始化为特定大小.当您写入流时,如果超过数组的大小,则流使用加倍算法来分配新数组.然后将信息从旧数组复制到新数组.在此之后,可以并且将收集旧数组,但它不会被压缩(想想:defragged).结果是地址空间中的漏洞将不再使用.一个MemoryStream可能使用多个数组,导致几个内存空间的总地址空间可能比源数据大得多.
AFAIK,此时没有办法强制垃圾收集器压缩你的内存地址空间.因此,解决方案是分配一个大块来处理最大的图像,然后一遍又一遍地重复使用同一个块,这样就不会得到无法访问的内存地址.
对于此代码,这意味着在循环外部创建内存流,并将整数传递给构造函数,以便将其初始化为合理的字节数.您会发现这也为您提供了良好的性能提升,因为您的应用程序突然不再花时间将数据从一个字节数组复制到另一个字节数组,这意味着即使您可以压缩地址表,这也是更好的选择:
Using imagestream As New MemoryStream(307200) 'start at 300K... gives you some breathing room for larger images For Each XImage As XImage In pdfDocument.Pages(pageCount).Resources.Images 'reset the stream,but keep using the same memory imagestream.Seek(0,SeekOrigin.Begin) imagestream.SetLength(0) XImage.Save(imagestream,System.Drawing.Imaging.ImageFormat.Jpeg) ' some further processing Next End Using
.net – 使用FileStreamResult,MemoryStream是如何关闭的?
public FileStreamResult DownloadBudgetedRoleOpportunities( Guid projectGuid,IEnumerable<Guid> guidrequiredRoles) { var rolebroker = new ProjectRoleBudgetbroker(); var memstream = rolebroker.CreateBudgetedRoleOpportunies( projectGuid,guidrequiredRoles); var fsr = new FileStreamResult ( memstream,"application/csv" ) { FileDownloadName = "RoleOpportunities.csv" }; // memstream.Close(); throws exception return fsr; }
解决方法
通过Google for FileStreamResult.cs快速搜索,您可以验证在WriteFile方法中,使用using语句正确处理流。 (无双关意)
protected override void WriteFile(HttpResponseBase response) { // grab chunks of data and write to the output stream Stream outputStream = response.OutputStream; using (FileStream) { byte[] buffer = new byte[_bufferSize]; while (true) { int bytesRead = FileStream.Read(buffer,_bufferSize); if (bytesRead == 0) { // no more data break; } outputStream.Write(buffer,bytesRead); } } }
.net – 可以不配置MemoryStream / StringReader吗?
通常我使用一个使用块来处理StringReader或MemoryStream,但是因为我想要返回一个XmlReader,如果我想要使用这个设计,我不能这样做.
我不希望MemoryStream分配大量的内存,所以我可以忍受资源释放的轻微延迟.
在这种情况下让GC处理StringReader和MemoryStream的后果是否可以接受?
我应该澄清,这是一个实际问题,而不是最佳实践问题.显然,这个理论要求我应该清理自己的资源分配,但理论上也说我应该选择最简单的设计来实现最大的可维护性.在某些情况下,打破最佳实践可以证明IMHO是合理的,我的问题是这个具体案例是否有理由打破最佳实践.
这也只是关于StringReader和MemoryStream,而不是一般的流或读者.
我在这种情况下证明它的理由是,StringReader / MemoryStream的实际创建被很好地封装在返回XmlReader的方法中,因此可以控制XmlReader不会被提供有限资源的流.
解决方法
我们不能让你处理它,但个人:我对我的使用很挑剔
关于如果未关闭.NET中的MemoryStream,是否会造成内存泄漏?和未关闭英文怎么写的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于.NET FileStream文件流,StreamReader文本流,MemoryStream内存流几种流的实例、.net – MemoryStream用法导致内存不足异常、.net – 使用FileStreamResult,MemoryStream是如何关闭的?、.net – 可以不配置MemoryStream / StringReader吗?的相关知识,请在本站寻找。
本文标签: