Use "using" or move "f.Dispose()" into a finally block to ensure it gets called even if the call throws.

Q: How could this leak? The only way I see is if the world stops ticking and the delayed action is never removed from World.fameEndActions.