The answer from what you've said so far is "probably".
Note, that you don't even need this situation of two different ASPX files, two requests to the same ASPX file would have the same issue, as each ASPX file can handle multiple simultaneous requests.
The big question is how does the object at o deal with it's file. If it's being used in a re-entrant manner, then that's fine. This is to say, if at any point you could have another thread call the method and because no state in the object is ever changed (only local variables get changed, no instance or static members) then you are fine.
If not, then you will need to lock on the methods in question. However, locking introduces a bottleneck in the flow. Even if there's never a deadlock, requests will queue up at this point, and if the method can't release the lock faster than new requests come in, the delay caused by that queue will get bigger and bigger until it becomes a serious problem.
If by "holds a file handle", you mean it has a File
object, and it calls File.OpenRead
each time it is used, before disposing of the stream returned in the same call, then that's fine. If however you mean that you have the stream returned by File.OpenRead
and you Seek
before each read, then you've got a concurrency issue.
While for a single threaded console application it may be more efficient to open a stream with OpenRead
and then Seek
if you need to look at the start of the file again, with a multithreaded application (and all ASP.NET is inherently multi-threaded even if you never explicitly create a thread) it is much, much more efficient to call OpenRead
each time you need to.