ProcessSample skeleton
Update file names
Subscribes to exited event on construction
Add missing file
Unsubscribes from Exited event on Dispose
Add EnableRaisingEvents property
WaitForExit completes after exit
WaitForExit completes sync if exited before subscribed
Race with exit and subscribe does not cause errors
WaitForExit is canceled if token requests cancellation
WaitForExit is canceled immediately if token is already canceled
WaitForExit completes successfully if already exited even if token is already canceled
Add Inner property
Rename ProcessEx to ProcessExitWatcher
Dispose does not change EnableRaisingEvents if started as true
WaitForExit completes with ObjectDisposed after Dispose
Dispose is idempotent
Refactor WaitForExitAsync - fast path for CancellationToken.None
WaitForExit after Dispose throws ObjectDisposed
Refactoring - disposed logic