1

当我使用 f10 调试代码时,它可以正常工作,没有错误!但在运行时我收到此错误:“已添加具有相同密钥的项目”

请帮忙

我的字典:

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 回答