/// <summary> /// Ends a process asynchronously according to a specified mode and timeout. /// </summary> /// <param name="process">The process to end.</param> /// <param name="mode">The mode of ending a process.</param> /// <param name="millisecondsTimeout">The amount of time, in milliseconds, to wait for the associated process to end.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The mode in which the process has been ended.</returns> public static async Task <ProcessEndMode> EndAsync( this Process process, ProcessEndMode mode, int millisecondsTimeout, CancellationToken cancellationToken) { if (process == null) { throw new ArgumentNullException(nameof(process)); } if (millisecondsTimeout < Timeout.Infinite) { throw new ArgumentOutOfRangeException(nameof(millisecondsTimeout), "The value needs to be either -1 (signifying an infinite timeout), 0 or a positive integer."); } mode = _ConditionEndMode(mode, ProcessEndMode.Graceful, ProcessEndMode.Close | ProcessEndMode.Interrupt); if ((mode & ProcessEndMode.Graceful) != 0) { if ((mode & ProcessEndMode.Close) == ProcessEndMode.Close && await _TryCloseProcessAsync(process, cancellationToken).ConfigureAwait(false)) { return(ProcessEndMode.Close); } if ((mode & ProcessEndMode.Interrupt) == ProcessEndMode.Interrupt && await _TryInterruptProcessAsync(process, cancellationToken).ConfigureAwait(false)) { return(ProcessEndMode.Interrupt); } if (await process.WaitForExitAsync(millisecondsTimeout, cancellationToken).ConfigureAwait(false)) { return(ProcessEndMode.Graceful); } } mode = _ConditionEndMode(mode, ProcessEndMode.Forceful, ProcessEndMode.Kill | ProcessEndMode.Exit); if ((mode & ProcessEndMode.Forceful) != 0) { if ((mode & ProcessEndMode.Exit) == ProcessEndMode.Exit && _TryExitProcess(process)) { return(ProcessEndMode.Exit); } if ((mode & ProcessEndMode.Kill) == ProcessEndMode.Kill && await _TryKillProcessAsync(process, cancellationToken).ConfigureAwait(false)) { return(ProcessEndMode.Kill); } } return(ProcessEndMode.None); }
static ProcessEndMode _ConditionEndMode(ProcessEndMode mode, ProcessEndMode group, ProcessEndMode groupModes) { var mask = groupModes & ~group; var maskedMode = mode & mask; if ((mode & group) != 0) { if (maskedMode == 0) { mode |= mask; } } else if (maskedMode != 0 && maskedMode != mask) { mode |= group; } return(mode); }
/// <summary> /// Ends a process according to a specified mode and timeout. /// </summary> /// <param name="process">The process to end.</param> /// <param name="mode">The mode of ending a process.</param> /// <param name="millisecondsTimeout">The amount of time, in milliseconds, to wait for the associated process to end.</param> /// <returns>The mode in which the process has been ended.</returns> public static ProcessEndMode End(this Process process, ProcessEndMode mode, int millisecondsTimeout) => TaskBridge.Execute(ct => EndAsync(process, mode, millisecondsTimeout, ct));
/// <summary> /// Ends a process according to a specified mode with default timeout. /// </summary> /// <remarks> /// The default timeout is 3 seconds. /// </remarks> /// <param name="process">The process to end.</param> /// <param name="mode">The mode of ending a process.</param> /// <returns>The mode in which the process has been ended.</returns> public static ProcessEndMode End(this Process process, ProcessEndMode mode) => End(process, mode, DefaultEndTimeout);
/// <summary> /// Ends a process asynchronously according to a specified mode with default timeout. /// </summary> /// <remarks> /// The default timeout is 3 seconds. /// </remarks> /// <param name="process">The process to end.</param> /// <param name="mode">The mode of ending a process.</param> /// <returns>The mode in which the process has been ended.</returns> public static Task <ProcessEndMode> EndAsync(this Process process, ProcessEndMode mode) => EndAsync(process, mode, DefaultEndTimeout);
/// <summary> /// Ends a process asynchronously according to a specified mode and timeout. /// </summary> /// <param name="process">The process to end.</param> /// <param name="mode">The mode of ending a process.</param> /// <param name="millisecondsTimeout">The amount of time, in milliseconds, to wait for the associated process to end.</param> /// <returns>The mode in which the process has been ended.</returns> public static Task <ProcessEndMode> EndAsync(this Process process, ProcessEndMode mode, int millisecondsTimeout) => EndAsync(process, mode, millisecondsTimeout, CancellationToken.None);
/// <summary> /// Ends a process asynchronously according to a specified mode with default timeout. /// </summary> /// <remarks> /// The default timeout is 3 seconds. /// </remarks> /// <param name="process">The process to end.</param> /// <param name="mode">The mode of ending a process.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The mode in which the process has been ended.</returns> public static Task <ProcessEndMode> EndAsync(this Process process, ProcessEndMode mode, CancellationToken cancellationToken) => EndAsync(process, mode, DefaultEndTimeout, cancellationToken);