I can't speak for what other people are doing, but writing your own class
(in C# no less) to deal with overlapped I/O by PInvoking out to the Win32
functions directly is not that difficult. I did it when putting together a
serial port class for a previous employer, and it didn't take me much more
than a day or so of work (and I'd never had any direct overlapped experience
prior to that).

On 12/15/05, John Davis <[EMAIL PROTECTED]> wrote:
>
> Yes, I disagree with your assertion stating the Stream interface is the
> wrong abstraction for random access because it already contains a Seek
> method.  The random access is already there.
>
> So, for streams where (CanSeek == true) there should also be a
> BeginRead/Write(file_offset, ...) which is threadsafe.
>
> Yes, you're right the docs say it isn't threadsafe.  But for heaven sake,
> surely we can add a class that is threadsafe for file io in the same way
> the
> Win32 API provides.  How are people supposed to write high throughput
> server
> software without a good async managed file io class?  Apparently everyone
> is
> still using C++.
>
> As you may have guessed, I've already hit this on my current
> project.  Lots
> of locks to compensate for the above oversight.
>
> >From: Ian Griffiths <[EMAIL PROTECTED]>
> >Reply-To: "Discussion of advanced .NET topics."
> ><[email protected]>
> >To: [email protected]
> >Subject: Re: [ADVANCED-DOTNET] Possible defect in BeginWrite on
> FileStream
> >Date: Thu, 15 Dec 2005 22:42:36 -0000
> >
> >John Davis wrote:
> > > Ian I'm afraid you're really mistaken on this one.
> >
> >Which bit do you disagree with?
> >
> >Do you disagree that Stream is the wrong abstraction for random access?
> >
> >Do you disagree that if a class is documented as not safe for
> >multi-threaded access, then it doesn't really matter what new methods
> >you add, you still can't use it from multiple threads?
> >
> >Do you disagree with the claim that Stream offering stream-like
> >behaviour is a design limitation and not an actual defect? (The absence
> >of a random access API might be regarded as a defect, but that doesn't
> >mean there's necessarily a problem with the stream API - it does what
> >it's designed to do.)
> >
> >You've obviously thought long and hard about it - almost 7 months
> >according to the email timestamps. :)  But I can't tell what I said that
> >you think I'm "really mistaken on".
> >
> >I'm not disagreeing that random access (as opposed to stream-like
> >access) would be nice to have. (Although it's not something I happen to
> >have run into a need for in any .NET projects yet.) I'm just saying
> >Stream's the wrong place for it.
> >
> >In particular, bear in mind that not all Streams are implemented on top
> >of something that necessarily has intrinsic OVERLAPPED-like
> >functionality. (Not all streams are files or file-like handles.)
> >
> >
> >
> > > What I'm looking for is the equivalent of a ReadFile or WriteFile
> > > call here the offset is passed in the OVERLAPPED struct.
> >
> >I agree there are circumstances in which this would be handy. But I
> >stand by my assertions that Stream is the wrong abstraction for this.
> >Not every Stream is a file. Stream is not meant to be an abstract
> >representation of a file - it's more widely applicable than that. (Hence
> >its narrower API - the more specific an API an abstraction has, the less
> >broadly applicable it is.)
> >
> >
> > > The call can occur through overlapped IO, or an IO completion
> > > port.  The call is also atomic.
> >
> >And it's not presenting a stream-like abstraction.  I think that's at
> >the heart of the issue.
> >
> >
> >
> > > There needs to be a random access async read/write of some
> > > sort which uses the OVERLAPPED struct in the Win32 API in that
> > > it has a file offset field for the read or write.
> >
> >Sure, just probably not Stream.
> >
> >I guess if you changed nature of the Stream API by adding new
> >non-streamish functionality and also changed the classes so they
> >permitted concurrent access then that'd solve the problem. (Except for
> >the fact that this might break a lot of existing streams because they
> >don't implement this feature right now...)
> >
> >But aren't you introducing a whole new abstraction?
> >
> >
> > > If one observes the current implementation in
> > > DotNetReflector, the OVERLAPPED struct is getting populated
> > > via the FileStream Seek call.  The OVERLAPPED struct is then
> > > used on the next async write.  Why implement it this way if
> > > FileStreams can only be used by a single thread?
> >
> >Err...isn't that a distinctly sequential approach to the problem? It
> >presumes that the call to Seek and the async write will follow on one
> >after the other without interference.
> >
> >You'd need a completely different implementation if you wanted to
> >support non-sequential use wouldn't you?
> >
> >
> >--
> >Ian Griffiths
> >
> >
> >On Thu, 26 May 2005 23:22:45 +0100, Ian Griffiths
> ><[EMAIL PROTECTED]>
> >wrote:
> >
> > >Even if there were an atomic method how would that help?  It wouldn't
> > >eliminate the race condition, because it would still be illegal to call
> > >the method simultaneously on multiple threads. (FileStream's
> > >documentation says it's illegal to do that.)  So you'd still need to
> >use
> > >locking or some other synchronization method to make sure your threads
> > >take it in turns even if there were an atomic method.
> > >
> > >I agree it would be cleaner to have a random access method if random
> > >access is what you're doing - a stream isn't really the right
> > >abstraction in that case.  (Sadly it's the only one we're offered
> > >AFAIK.)
> > >
> > >But is this a defect?  It's a bug to use a stream from multiple threads
> > >without synchronization.  It would still be a bug even with the atomic
> > >method you propose.
> > >
> > >
> > >--
> > >Ian Griffiths
> > >http://www.interact-sw.co.uk/iangblog/
> > >
> > >> -----Original Message-----
> > >> From: John Davis
> > >>
> > >> >Are you saying that locking, Seeking, BeginWriteing, and unlocking
> >is
> > >> not good enough?
> > >>
> > >> Well, I guess it is good enough, just doesn't seem very elegant.
> > >Would be
> > >> nice if there was an offset in there so one "atomic" call could be
> > >made.
> > >> Same as with Win32 overlapped io.
> > >>
> > >> >Does the BeginWrite not in effect take a snapshot of
> > >> the seek location when the operation starts?
> > >>
> > >> I don't know for certain if it does, I certainly hope so.  Time to go
> > >> digging with reflector I guess.
> > >>
> > >> Ian Griffiths <[EMAIL PROTECTED]> wrote:
> > >> The documentation says that members of this class are not thread
> >safe,
> > >> so multiple threads shouldn't be using this at any given instance.
> >You
> > >> need to do some kind of locking if you have multiple threads using
> >it.
> > >>
> > >> Are you saying that locking, Seeking, BeginWriteing, and unlocking is
> > >> not good enough? Does the BeginWrite not in effect take a snapshot of
> > >> the seek location when the operation starts?
> >
> >===================================
> >This list is hosted by DevelopMentor(r)  http://www.develop.com
> >
> >View archives and manage your subscription(s) at
> http://discuss.develop.com
>
> ===================================
> This list is hosted by DevelopMentor(r)  http://www.develop.com
>
> View archives and manage your subscription(s) at
> http://discuss.develop.com
>



--
Eric Means
[EMAIL PROTECTED]
http://www.randomtree.org/eric/

===================================
This list is hosted by DevelopMentorĀ®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to