2012-04-12 7 views
1

Wenn ich Code mit f10 debuggen funktioniert es ohne Fehler .Aber auf Runtime ich diese Fehlermeldung bekam: „Ein Element mit demselben Schlüssel wurde bereits hinzugefügt“Bei der Verwendung des statischen Wörterbuchs wurde der Fehler "Artikel wurde bereits hinzugefügt" angezeigt. in ASP.NET

Plz helfen

Mein Wörterbuch:

public static Dictionary<string, string> ImageFilePath 
     = new Dictionary<string, string>(); 

Verwendung in derselben Glob.cs meine Funktion:

public static Image ShowImageOnColumn(string Value,byte ImageHeigth,byte ImageWidth) 
{ 

    . 
    . 
    . 

    string FilePath = "",ImgId = ""; 


    Image img_ = new Image(); 

    Random rnd = new Random(); 

    ImgId = rnd.Next(100000000).ToString(); 
    img_.ImageUrl = "ShowImageInRuntime.aspx?FileName=" + ImgId; 

    ImageFilePath.Add(ImgId, FilePath); 


    img_.Height = Unit.Pixel(ImageHeigth); 
    img_.Width = Unit.Pixel(ImageWidth); 

    return img_; 

    } 
+2

Ein Wörterbuch Hinzufügen nicht enthalten doppelte Schlüssel und Ihr Zufall generiert 'ImgId's duplizieren. –

+0

Setzen Sie die Nachrichtenbox, bevor Sie 'hinzufügen' zeigen Sie alle Elemente mit sortieren und starten Sie Ihre App. Ich denke, es gibt wirklich Dubletten Artikel – Likurg

+0

Versuchen Sie, die zufällige Generation Code mit Guid.NewGuid() zu ersetzen. ToString (N) – Pankaj

Antwort

2

Sie bewachen nicht dein ImageFilePath.Add Anruf. Wenn der Schlüssel bereits existiert, erhalten Sie eine Ausnahme, die so viel sagt.

Sie können für einen Schlüssel einen Scheck tun:

if (ImageFilePath.ContainsKey(ImgId)) 
{ 
    ImageFilePath[ImgId] = FilePath; 
} 

Oder Sie können auf den Index gesetzt, wird dies hinzufügen, wenn es fehlt und zu aktualisieren, wenn es vorhanden ist:

ImageFilePath[ImgId] = FilePath; 

Im Gegensatz zu Aufruf von Hinzufügen.

Beachten Sie jedoch, dass statische Mitglieder wahrscheinlich verloren gehen, wenn IIS Arbeitsprozesse recycelt. Daher neigen sie dazu, vermieden zu werden. Es gibt auch Probleme mit mehreren Threads, da das statische Element im gesamten Prozess sichtbar ist. Wenn Sie einen zufälligen Dateinamen benötigen, versuchen Sie DateTime.ToString("ddMMyyyyhhmmssfff") oder Guid.NewGuid(), anstatt eine Instanz von Random am Leben zu halten.

Path verfügt auch über eine GetTempFileName Methode.

1

Es ist, weil Sie Random Klasse instanziieren jedes Mal, wenn Sie die Funktion verwenden und starten Sie die Zufallszahlen. Instanziieren Sie die Random in einem Singleton, wahrscheinlich im Klassenkonstruktor, und Sie erhalten bei jedem Anruf eine gültige uniq (ish) -Nummer.

Ich würde auch vorschlagen, dass Random ist nicht eindeutig, für einen eindeutigen Wert Sie wahrscheinlich einen Hash-Algorithmus verwenden möchten.

1

Verwenden Sie Guid.NewGuid().ToString("N") anstelle der Zufallszahl. Dies würde sicherstellen, dass keine Kollision auftritt. Geben Sie auch einen Gedanken zur Verwendung von statischen Elementen. Sie werden über mehrere Threads hinweg geteilt, und es kann zu Thread-Sicherheitsproblemen kommen, wenn mehrere Benutzer gleichzeitig auf Ihre Site zugreifen.

+0

Guid ist auch nicht einzigartig, und kann weniger eindeutig als Random sein. Versuchen Sie 1-10 Millionen GUIDs in ein Wörterbuch einzufügen und Sie werden sehen ... Selbstkorrektur: Guid.GetHash() ist was nicht einzigartig ist –

+1

@PeterAronZentai Guid ist vielleicht nicht "einzigartig", aber es hat eine Menge mehr verfügbare Werte als int. –

+0

@Peter Aron Zentai 'Guid.NewGuid(). ToString (" N ") erzeugt einen 32-stelligen Wert. Wie kann es also doppelt sein? Wenn ich nur bis 10 Millionen erzeuge. – Pankaj

0

Überprüfen Sie den Schlüssel bereits vorhanden ist oder nicht, bevor der Schlüssel zum Wörterbuch

if (!ImageFilePath.ContainsKey(ImgId))      
{ 
    ImageFilePath.Add(ImgId,FilePath); 
} 
Verwandte Themen