How to ensure Dispose() is called? - C#