我正在尝试同步要提供图像的webapi。当我请求一个特定的图像时,它会检查图像是否已经存在,如果有,则返回;如果不存在,则会创建并返回。.net文件访问同步
我的问题是,它显然不是像这样的线程安全;我有一个线程进来,并确定图像不存在,并开始创建它,而另一个请求进来,也确定图像不存在(只是还),并尝试创建它。我知道我可以锁定整个事情以避免这个问题,但我试图避免这个问题。将会有100,000个图像,我不明白为什么我需要停止所有线程阅读其他图像,因为只有一个图像尚不存在。有没有一种“通常”的方式来做到这一点?图像是由ID请求的,我可以锁定特定图像的ID吗?例如
List<long> _locks = new List<long>();
_locks.Add(17);
lock(_locks[0]){...}
它只是看起来不正确...肯定有更好的解决方案?
你可以做的是,在你的'Read'上添加3次重试周期,相隔2秒。因此,如果您收到“文件访问异常”,大概在写入文件时,请等待并再次尝试读取。 –
@ T.S。感谢队友,我想到了这一点,我猜想这是一个“备份”解决方案,但如果可以的话,我想尽量避免出现异常。我在多线程方面没有做太多的工作,所以试图弄清楚如何正确地做到这一点。 尝试锁定一个(静态)对象上的整个部分,平均响应时间从20ms到200ms ... !! – Andy