1234567891011121314151617181920212223242526272829303132333435363738 |
- using System;
- using System.Diagnostics;
- using System.Threading;
- using System.Threading.Tasks;
- namespace GodotTools.Core
- {
- public static class ProcessExtensions
- {
- public static async Task WaitForExitAsync(this Process process, CancellationToken cancellationToken = default)
- {
- var tcs = new TaskCompletionSource<bool>();
- void ProcessExited(object sender, EventArgs e)
- {
- tcs.TrySetResult(true);
- }
- process.EnableRaisingEvents = true;
- process.Exited += ProcessExited;
- try
- {
- if (process.HasExited)
- return;
- using (cancellationToken.Register(() => tcs.TrySetCanceled()))
- {
- await tcs.Task;
- }
- }
- finally
- {
- process.Exited -= ProcessExited;
- }
- }
- }
- }
|