Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 执行过程中没有内存的应用程序_C#_Visual Studio - Fatal编程技术网

C# 执行过程中没有内存的应用程序

C# 执行过程中没有内存的应用程序,c#,visual-studio,C#,Visual Studio,我有一个Visual Studio c#应用程序,其任务是下载图片,进行一些操作,如旋转和翻转,并最终将新图片存储在外部HD中 我有几个线程做同样的工作 当应用程序运行了几个小时后,会出现一个异常,表明存储内存不足 下图显示了应用程序启动时的进程内存,但当它运行一段时间后,这样的内存会增加到3Gb 在程序中,我关闭所有流、内存流、位图、实例等。 所以,问题是,在执行过程中如何释放内存或避免内存增加 try { request = (HttpWebRequest)WebRequest.

我有一个Visual Studio c#应用程序,其任务是下载图片,进行一些操作,如旋转和翻转,并最终将新图片存储在外部HD中

我有几个线程做同样的工作

当应用程序运行了几个小时后,会出现一个异常,表明存储内存不足

下图显示了应用程序启动时的进程内存,但当它运行一段时间后,这样的内存会增加到3Gb

在程序中,我关闭所有流、内存流、位图、实例等。 所以,问题是,在执行过程中如何释放内存或避免内存增加

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"); }