My observation in practice has been that GC.SuppressFinalize does not always suppress the call to the finalizer. It could be that the finalizer gets called nontheless. I won
One oddity you may be seeing is that the finalizer can still run even while an instance method is still running, so long as that instance method doesn't use any variables later on. So in your sample code, the Dispose method doesn't use any instance variables after the first line. The instance can then be finalized, even though Dispose is still running.
If you insert a call to GC.KeepAlive(this) at the end of the Dispose method, you may find the problem goes away.
Chris Brumme has a blog post about this, and I think there's another around somewhere...