C# 执行过程中没有内存的应用程序
我有一个Visual Studio c#应用程序,其任务是下载图片,进行一些操作,如旋转和翻转,并最终将新图片存储在外部HD中 我有几个线程做同样的工作 当应用程序运行了几个小时后,会出现一个异常,表明存储内存不足 下图显示了应用程序启动时的进程内存,但当它运行一段时间后,这样的内存会增加到3Gb 在程序中,我关闭所有流、内存流、位图、实例等。 所以,问题是,在执行过程中如何释放内存或避免内存增加C# 执行过程中没有内存的应用程序,c#,visual-studio,C#,Visual Studio,我有一个Visual Studio c#应用程序,其任务是下载图片,进行一些操作,如旋转和翻转,并最终将新图片存储在外部HD中 我有几个线程做同样的工作 当应用程序运行了几个小时后,会出现一个异常,表明存储内存不足 下图显示了应用程序启动时的进程内存,但当它运行一段时间后,这样的内存会增加到3Gb 在程序中,我关闭所有流、内存流、位图、实例等。 所以,问题是,在执行过程中如何释放内存或避免内存增加 try { request = (HttpWebRequest)WebRequest.
try
{
request = (HttpWebRequest)WebRequest.Create(new Uri(this._url, UriKind.Absolute));
request.UserAgent = UserAgent.get_user_agent();
noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
request.CachePolicy = noCachePolicy;
response = request.GetResponse();
responseStream = response.GetResponseStream();
reader = new BinaryReader(responseStream);
memoryStream = new MemoryStream();
byte[] bytebuffer = new byte[BytesToRead];
int bytesRead = reader.Read(bytebuffer, 0, BytesToRead);
while (bytesRead > 0)
{
memoryStream.Write(bytebuffer, 0, bytesRead);
bytesRead = reader.Read(bytebuffer, 0, BytesToRead);
}
image.BeginInit();
memoryStream.Seek(0, SeekOrigin.Begin);
image.StreamSource = memoryStream;
image.EndInit();
if ( image.Width < 100 || image.Height < 50 )
{
_parent.working_image = "Error procesado imagen";
_parent.isWorking = false;
return false;
}
Bitmap image_rotated = CropImage(RotateFlipImage(BitmapImage2Bitmap(image)));
if (image_rotated == null)
{
_parent.working_image = "Error procesado imagen";
_parent.isWorking = false;
return false;
}
BitmapFrame image200 = CreateResizedImage(Bitmap2BitmapImage(image_rotated), "large");
BitmapFrame image100 = CreateResizedImage(Bitmap2BitmapImage(image_rotated), "short");
// Directorio
int directory_main = (int)(this._Id / 10000);
// Generamos la imagen de 200px
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
String photolocation = @"D:\hilo_" + hilo + "_200.jpg"; //file name
encoder.Frames.Add(BitmapFrame.Create(image200));
FileStream filestream = null;
try
{
using (filestream = new FileStream(photolocation, FileMode.Create))
{
encoder.Save(filestream);
}
// creamos directorio si no existe
System.IO.Directory.CreateDirectory(@"D:\backoffice\originales\" + directory_main + @"\" + this._Id);
if (!this.saveImage(photolocation, @"D:\backoffice\originales\" + directory_main + @"\" + this._Id + @"\" + _filename + "_200.jpg"))
{
_parent.working_image = "Error procesado imagen";
_parent.isWorking = false;
image = null;
memoryStream.Close();
filestream.Close();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
return false;
}
filestream.Close();
// Generamos la imagen de 100px
encoder = new JpegBitmapEncoder();
photolocation = @"D:\hilo_" + hilo + "_100.jpg"; //file name
encoder.Frames.Add(BitmapFrame.Create(image100));
using (filestream = new FileStream(photolocation, FileMode.Create))
{
encoder.Save(filestream);
}
// creamos directorio si no existe
if (!this.saveImage(photolocation, @"D:\backoffice\originales\" + directory_main + @"\" + this._Id + @"\" + _filename + "_100.jpg"))
{
_parent.working_image = "Error procesado imagen";
_parent.isWorking = false;
image = null;
memoryStream.Close();
filestream.Close();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
return false;
}
filestream.Close();
encoder = null;
image100 = null;
image200 = null;
SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-UC7AQ3V\SQLEXPRESS;Integrated Security=SSPI;User ID=frank;password=jungla");
SqlCommand cmd = new SqlCommand("UPDATE dbo.image_objects_download_log SET locked=0, worked=1, isWorking=1 WHERE object_id=@id", con);
cmd.Parameters.AddWithValue("@id", Id);
con.Open();
cmd.ExecuteNonQuery();
cmd.Dispose();
con.Close();
_parent.working_image = "Trabajo finalizado con éxito";
_parent.isWorking = false;
image = null;
memoryStream.Close();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
return true;
}
catch (IOException e)
{
Console.WriteLine("---------> " + e.Message);
_parent.working_image = "Error procesado imagen";
_parent.isWorking = false;
image = null;
memoryStream.Close();
filestream.Close();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
return false;
}
catch (UriFormatException e)
{
_parent.working_image = "Error procesado imagen";
_parent.isWorking = false;
image = null;
memoryStream.Close();
filestream.Close();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
return false;
}
}
试试看
{
request=(HttpWebRequest)WebRequest.Create(新Uri(this.\uURL,UriKind.Absolute));
request.UserAgent=UserAgent.get_user_agent();
noCachePolicy=新的HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
request.CachePolicy=noCachePolicy;
response=request.GetResponse();
responseStream=response.GetResponseStream();
reader=新的二进制读取器(responseStream);
memoryStream=新的memoryStream();
byte[]bytebuffer=新字节[BytesToRead];
int bytesRead=reader.Read(bytebuffer,0,BytesToRead);
而(字节读取>0)
{
memoryStream.Write(字节缓冲,0,字节读取);
bytesRead=reader.Read(bytebuffer,0,BytesToRead);
}
image.BeginInit();
memoryStream.Seek(0,SeekOrigin.Begin);
image.StreamSource=memoryStream;
image.EndInit();
if(图像宽度<100 | |图像高度<50)
{
_parent.working_image=“Error procesado imagen”;
_parent.isWorking=false;
返回false;
}
位图图像_rotated=CropImage(RotateFlipImage(BitmapImage2Bitmap(图像)));
如果(图像旋转==null)
{
_parent.working_image=“Error procesado imagen”;
_parent.isWorking=false;
返回false;
}
BitmapFrame image200=CreateResizedImage(Bitmap2BitmapImage(图像_旋转),“大”);
BitmapFrame image100=CreateResizedImage(Bitmap2BitmapImage(图像_旋转),“短”);
//导演
int directory_main=(int)(this.\u Id/10000);
//200px图像总成
JpegBitmapEncoder编码器=新的JpegBitmapEncoder();
字符串photolocation=@“D:\hilo_”+hilo+“_200.jpg”;//文件名
Add(BitmapFrame.Create(image200));
FileStream FileStream=null;
尝试
{
使用(filestream=newfilestream(photolocation,FileMode.Create))
{
保存(文件流);
}
//没有直接的奶油
System.IO.Directory.CreateDirectory(@“D:\backoffice\originales\”+目录\u main+@“\”+此.\u Id);
如果(!this.saveImage(photolocation,@“D:\backoffice\originales\”+目录\u main++“\”+此.\u Id++“\”+\u文件名+”\u 200.jpg”))
{
_parent.working_image=“Error procesado imagen”;
_parent.isWorking=false;
image=null;
memoryStream.Close();
filestream.Close();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
返回false;
}
filestream.Close();
//通用成像设备
编码器=新的JPEG位图编码器();
photolocation=@“D:\hilo_”+hilo+“_100.jpg”;//文件名
encoder.Frames.Add(BitmapFrame.Create(image100));
使用(filestream=newfilestream(photolocation,FileMode.Create))
{
保存(文件流);
}
//没有直接的奶油
如果(!this.saveImage(photolocation,@“D:\backoffice\originales\”+目录\u main++“\”+此.\u Id++“\”+\u文件名+”\u 100.jpg”))
{
_parent.working_image=“Error procesado imagen”;
_parent.isWorking=false;
image=null;
memoryStream.Close();
filestream.Close();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
返回false;
}
filestream.Close();
编码器=空;
image100=null;
image200=null;
SqlConnection con=newsqlconnection(@“数据源=DESKTOP-UC7AQ3V\SQLEXPRESS;集成安全=SSPI;用户ID=frank;密码=jungla”);
SqlCommand cmd=newsqlcommand(“更新dbo.image\u objects\u download\u log SET locked=0,worked=1,isWorking=1,其中object\u id=@id”,con);
cmd.Parameters.AddWithValue(“@id”,id);
con.Open();
cmd.ExecuteNonQuery();
cmd.Dispose();
con.Close();
_parent.working_image=“Trabajo finalizado conéxito”;
_parent.isWorking=false;
image=null;
memoryStream.Close();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
返回true;
}
捕获(IOE异常)
{
Console.WriteLine(“----------->”+e.Message);
_parent.working_image=“Error procesado imagen”;
_parent.isWorking=false;
image=null;
memoryStream.Close();
filestream.Close();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
返回false;
}
捕获(尿酸盐)
{
_parent.working_image=“Error procesado imagen”;
_parent.isWorking=false;
image=null;
memoryStream.Close();
filestream.Close();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
返回false;
}
}
我建议您使用块将实现IDisposable
的所有对象包装在中。我将在代码的响应部分演示:
try
{
request = (HttpWebRequest)WebRequest.Create(new Uri(this._url, UriKind.Absolute));
request.UserAgent = UserAgent.get_user_agent();
noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
request.CachePolicy = noCachePolicy;
(WebResponse response = request.GetResponse())
{
// Rest of your code inside here
}
}
这对于您使用的图像资源尤其重要BitmapFrame image200 = null;
BitmapFrame image100 = null;
using(Bitmap image_rotated = CropImage(RotateFlipImage(BitmapImage2Bitmap(image))))
{
if (image_rotated == null)
{
_parent.working_image = "Error procesado imagen";
_parent.isWorking = false;
return false;
}
image200 = CreateResizedImage(Bitmap2BitmapImage(image_rotated), "large");
image100 = CreateResizedImage(Bitmap2BitmapImage(image_rotated), "short");
}