使用静态字典时,我在 ASP.NET 中收到错误“项目已添加”
本文关键字:错误 项目 项目已添加 添加 字典 静态 NET ASP 我在 | 更新日期: 2023-09-27 18:31:05
当我使用 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_;
}
你没有保护你的ImageFilePath.Add
呼叫。如果密钥已经存在,您将收到一个异常,说明同样多。
您可以检查密钥:
if (ImageFilePath.ContainsKey(ImgId))
{
ImageFilePath[ImgId] = FilePath;
}
或者您可以在索引上设置,如果缺少索引,这将添加,如果存在,则更新:
ImageFilePath[ImgId] = FilePath;
而不是调用添加。
但请注意,当 IIS 回收工作进程时,静态成员可能会丢失。因此,它们往往被避免。还存在多线程问题,因为静态成员在整个进程中可见。
如果您需要随机文件名,请尝试DateTime.ToString("ddMMyyyyhhmmssfff")
或Guid.NewGuid()
,而不是保持Random
实例处于活动状态。
Path
还具有GetTempFileName
方法。
这是因为每次使用函数并重新启动随机种子时都会实例化Random
类。在单例中实例化Random
,可能在类构造函数中,每次调用时都会有一个有效的 uniq(ish) 号码。
我还建议,随机不是唯一的,对于唯一值,您很可能希望使用哈希算法。
使用 Guid.NewGuid().ToString("N")
而不是 Random 数。这将确保没有碰撞。此外,给出有关静态成员使用的思考过程。它们在多个线程之间共享,当多个用户同时访问您的网站时,您可能会遇到线程安全问题。
在将密钥添加到字典之前检查密钥是否已存在
if (!ImageFilePath.ContainsKey(ImgId))
{
ImageFilePath.Add(ImgId,FilePath);
}