Synchronising downloads and updates (2)
There was a potential deadlock in the last piece of code. When you obtain any kind of lock you will mostly use a try..finally block to ensure the lock is released when you have finished with it. The using() command expands to a try..finally block so the original code might look okay, however if you mentally expand the code you will see the problem. using (FileLockingService.FileReadLock(product1.ID)) { //Some code here } This becomes var disposable = FileLockingService.FileReadLock(product1.ID); try { //Some code here } finally { disposable.Dispose(); } So why is this a problem? In a single threaded application it isn't, but this is a website so there are multiple threads running at the same time. Now take into account the fact that a web request has a timeout, what if the thread is aborted after the lock is obtained? Ordinarily this isn't a problem because the acquisition is followed immediately by a "try", but if we expand this code further it is ev