Example #1
0
        /// <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);
        }
Example #2
0
        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);
        }
Example #3
0
 /// <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));
Example #4
0
 /// <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);
Example #5
0
 /// <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);
Example #6
0
 /// <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);
Example #7
0
 /// <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);