Avatar billede innercitydk Nybegynder
07. november 2005 - 12:28 Der er 11 kommentarer og
1 løsning

Cache problemer

Jeg har en side hvor der bliver genereret nogle thumbs fra en galleri mappe med billeder. Når siden bliver afviklet kan jeg efterfølgende ikke slette billederne fra mappen før der er gået et vist stykke tid. Jeg tror at det er fordi siden bliver gemt i cache men jeg er ikke sikker. Den skriver at filen er i brug når jeg prøver at slette den!?

Nogle forslag :)
Avatar billede Slettet bruger
07. november 2005 - 13:41 #1
Hvis du ikke får kaldt Dispose korrekt kan filerne være låst af de objekter og bliver dermed først frigivet når GC tilfældigvis vælger at fjerne dem og dermed kalder Finalize og dermed implicit oftest samme funktionalitet som Dispose.

Husk for alle objekter som har IDispose kald Dispose.
Avatar billede innercitydk Nybegynder
07. november 2005 - 13:42 #2
Kan du give et eksempel jeg er ret ny til asp.net :)
Avatar billede innercitydk Nybegynder
07. november 2005 - 13:42 #3
for det lyder meget plausibelt at det er det som er galt
Avatar billede Slettet bruger
07. november 2005 - 13:46 #4
Hvis en klasse fx Image eller Bitmap implementere IDispose interface så skal du når du er færdig ved at bruge dem kalde Dispose på objektet.

Bitmap b = new Bitmap();

do stuff with b

b.Dispose();

Alternativt kan du anvende using som følger:

using(Bitmap b = nwe Bitmap()) {
  do stuff with bitmap
}

her sørger using for at Dispose bliver kaldt.
Avatar billede innercitydk Nybegynder
07. november 2005 - 13:50 #5
hmm.. du kan lige se koden og så måske komme med et forslag

Scriptet på siden:

<script language="c#" runat="server">

void Page_Load(Object sender, EventArgs e)
{
    const int maxWidth  = 100;
    const int maxHeight = 100;
   
    ArrayList pics = new ArrayList();
    string html;
    int imgHeight;
    int imgWidth;
   
foreach(string s in Directory.GetFiles(Server.MapPath("galleri/"), "*.jpg"))
{   
  System.Drawing.Image currentImage = System.Drawing.Image.FromFile(s);
     
  imgHeight = currentImage.Height;
  imgWidth = currentImage.Width;
  if ((imgWidth > maxWidth) || (imgHeight > maxHeight))
  {
    int deltaWidth  = imgWidth - maxWidth;
    int deltaHeight = imgHeight - maxHeight;
    double scaleFactor;
       
    if (deltaHeight > deltaWidth)
    {
      scaleFactor = Convert.ToDouble(maxHeight) / imgHeight;
    }
    else
    {
      scaleFactor = Convert.ToDouble(maxWidth) / imgWidth;
    }
   
    imgWidth  = Convert.ToInt32(imgWidth * scaleFactor);
    imgHeight = Convert.ToInt32(imgHeight* scaleFactor);         
  }
 
  if ((imgHeight != currentImage.Height) || (imgWidth != currentImage.Width))
  {
    html = "<a href=\"viewimage.aspx?img=galleri/" + Path.GetFileName(s) + "\">" + "<img border=\"1\" style=\"border:1px darkred\" src=\"getthumb.aspx?img=galleri/" + Path.GetFileName(s) + "&w=" + imgWidth.ToString() + "&h=" + imgHeight.ToString() + "\" " + "height=\"" + imgHeight + "\" width=\"" + imgWidth + "\">" + "</a><br>"+Path.GetFileName(s).ToString();
  }
  else
  {   
    html = "<a href=\"viewimage.aspx?img=galleri/" + Path.GetFileName(s) + "\">" + "<img border=\"1\" src=\"getthumb.aspx?img=galleri/" + Path.GetFileName(s) + "\" " + "height=\"" + imgHeight.ToString() + "\" width=\"" + imgWidth.ToString() + "\">" + "</a><br>"+Path.GetFileName(s).ToString();
  }

    pics.Add(html);
  }
  dlPictures.DataSource = pics;
  dlPictures.DataBind();
}
</script>




GetThumb siden (genererer thumbs):

<!--ASP.NET Simple PhotoGallery -->
<!--http://www.thezeal.com/software -->

<%@Import Namespace="System.Drawing.Imaging" %>
<%@Import Namespace="System.Drawing" %>
<script language="c#" runat="server">

public void Page_Load(Object sender, EventArgs e)
{

    // Read in the image filename to create a thumbnail of
    string imageUrl = Request.QueryString["img"];
   
    // Read in the width and height
    int imageHeight = Convert.ToInt32(Request.QueryString["h"]);
    int imageWidth  = Convert.ToInt32(Request.QueryString["w"]);

    //Make sure that the image URL doesn't contain any /'s or \'s
    //If imageUrl.IndexOf("/") >= 0 Or imageUrl.IndexOf("\") >= 0 then
    // We found a / or \
    //  Response.End()
    // End If
   
    //Add on the appropriate directory
    //imageUrl = imageUrl
   
    System.Drawing.Image fullSizeImg = System.Drawing.Image.FromFile(Server.MapPath(imageUrl));

    //Do we need to create a thumbnail?
    Response.ContentType = "image/jpeg";
    if ((imageHeight > 0) && (imageWidth > 0))
    {
      Bitmap bitmap1 = new Bitmap(imageWidth, imageHeight, fullSizeImg.PixelFormat);

      Graphics new_g  = Graphics.FromImage(bitmap1);
      new_g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
      new_g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
      new_g.DrawImage(fullSizeImg, 0, 0, bitmap1.Width, bitmap1.Height);

      bitmap1.Save(Response.OutputStream, ImageFormat.Jpeg);

      new_g.Dispose();
      bitmap1.Dispose();
               
    }
    else
    {
      fullSizeImg.Save(Response.OutputStream, ImageFormat.Jpeg); 
    }
}
</script>
Avatar billede Slettet bruger
07. november 2005 - 13:55 #6
kalde currentImage.Dispose() i første afdeling.

og kalde fullSizeImg.Dispose() i sidste.
Avatar billede innercitydk Nybegynder
07. november 2005 - 14:04 #7
Nu er der et rødt kryds over billederne på siden.

Billederne hives ind på følgende måde:

<asp:DataList runat="server" id="dlPictures" 
    RepeatColumns="5"
    GridLines = "Both"
    ItemStyle-HorizontalAlign="Center"
    cellpadding="10"
    cellspacing="0"
    BorderColor ="Black"
    BorderStyle="Solid"
    BorderWidth="0"
    HorizontalAlign="Center"
    VerticalAlign="Middle">   
  <ItemTemplate>
    <%# Container.DataItem %>
  </ItemTemplate>
</asp:DataList>

skal man dispose datalisten?
Avatar billede innercitydk Nybegynder
07. november 2005 - 14:09 #8
jeg satte dispose ind følgende steder:

if ((imgHeight != currentImage.Height) || (imgWidth != currentImage.Width))
  {
    html = "<a href=\"viewimage.aspx?img=galleri/" + Path.GetFileName(s) + "\">" + "<img border=\"1\" style=\"border:1px darkred\" src=\"getthumb.aspx?img=galleri/" + Path.GetFileName(s) + "&w=" + imgWidth.ToString() + "&h=" + imgHeight.ToString() + "\" " + "height=\"" + imgHeight + "\" width=\"" + imgWidth + "\">" + "</a><br>"+Path.GetFileName(s).ToString();
  }
  else
  {   
    html = "<a href=\"viewimage.aspx?img=galleri/" + Path.GetFileName(s) + "\">" + "<img border=\"1\" src=\"getthumb.aspx?img=galleri/" + Path.GetFileName(s) + "\" " + "height=\"" + imgHeight.ToString() + "\" width=\"" + imgWidth.ToString() + "\">" + "</a><br>"+Path.GetFileName(s).ToString();
  }
    pics.Add(html);
    currentImage.Dispose();



og


else
    {
      fullSizeImg.Save(Response.OutputStream, ImageFormat.Jpeg); 
    }
    fullSizeImg.Dispose()
Avatar billede Slettet bruger
07. november 2005 - 14:10 #9
Do skal bare sikre dig at Dispose bliver kaldt og det kan være som det sidste om det skal være det vigtige er bare det bliver gjort, ja og bevares inden du forsøger at slette billederne.
Avatar billede innercitydk Nybegynder
07. november 2005 - 14:21 #10
virker stadig ikke
Avatar billede Slettet bruger
07. november 2005 - 14:24 #11
Her ikke rigtigt flere ideer til den så, sorry
Avatar billede innercitydk Nybegynder
04. december 2005 - 18:54 #12
lukker spørgsmålet
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester