1

f10でコードをデバッグすると、エラーなしで動作します!。しかし、実行時に、「同じキーを持つアイテムがすでに追加されています」というエラーが発生しました。

Plzヘルプ

私の辞書:

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

同じGlob.csで私の関数を使用する:

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_;

   }
4

4 に答える 4

2

あなたはあなたのImageFilePath.Add呼び出しを守っていません。キーがすでに存在する場合は、同じように言う例外が発生します。

キーのチェックを行うことができます:

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

または、インデックスに設定することもできます。これにより、インデックスが欠落している場合は追加され、存在する場合は更新されます。

ImageFilePath[ImgId] = FilePath;

Addを呼び出すのとは対照的です。

ただし、IISがワーカープロセスをリサイクルすると、静的メンバーが失われる可能性があることに注意してください。したがって、それらは回避される傾向があります。静的メンバーがプロセス全体に表示されるため、マルチスレッドの問題もあります。

ランダムなファイル名が必要な場合は、インスタンスを存続させるのではなく、DateTime.ToString("ddMMyyyyhhmmssfff")またはを試してください。Guid.NewGuid()Random

Pathメソッドも備えていますGetTempFileName

于 2012-04-12T12:51:35.100 に答える
1

Randomこれは、関数を使用するたびにクラスをインスタンス化し、ランダムシードを再起動するためです。おそらくクラスコンストラクターでシングルトンでインスタンス化するRandomと、呼び出すたびに有効なuniq(ish)番号が得られます。

また、ランダムは一意ではないことをお勧めします。一意の値については、おそらくハッシュアルゴリズムを使用する必要があります。

于 2012-04-12T12:53:54.160 に答える
1

Guid.NewGuid().ToString("N")乱数の代わりに使用します。これにより、衝突が発生しなくなります。また、静的メンバーの使用法について考えてください。それらは複数のスレッド間で共有され、複数のユーザーが同時にサイトにアクセスすると、スレッドセーフの問題が発生する可能性があります。

于 2012-04-12T12:55:16.803 に答える
0

キーを辞書に追加する前に、キーがすでに存在するかどうかを確認してください

if (!ImageFilePath.ContainsKey(ImgId))                     
{
    ImageFilePath.Add(ImgId,FilePath); 
} 
于 2012-04-12T13:00:00.593 に答える