File: Process\RunningProject.cs
Web Access
Project: ..\..\..\src\BuiltInTools\dotnet-watch\dotnet-watch.csproj (dotnet-watch)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
 
using System.Collections.Immutable;
using Microsoft.Build.Graph;
using Microsoft.DotNet.HotReload;
 
namespace Microsoft.DotNet.Watch
{
    internal delegate ValueTask<RunningProject> RestartOperation(CancellationToken cancellationToken);
 
    internal sealed class RunningProject(
        ProjectGraphNode projectNode,
        ProjectOptions options,
        HotReloadClients clients,
        Task<int> runningProcess,
        int processId,
        CancellationTokenSource processExitedSource,
        CancellationTokenSource processTerminationSource,
        RestartOperation restartOperation,
        IReadOnlyList<IDisposable> disposables,
        ImmutableArray<string> capabilities) : IDisposable
    {
        public readonly ProjectGraphNode ProjectNode = projectNode;
        public readonly ProjectOptions Options = options;
        public readonly HotReloadClients Clients = clients;
        public readonly ImmutableArray<string> Capabilities = capabilities;
        public readonly Task<int> RunningProcess = runningProcess;
        public readonly int ProcessId = processId;
        public readonly RestartOperation RestartOperation = restartOperation;
 
        /// <summary>
        /// Cancellation source triggered when the process exits.
        /// </summary>
        public readonly CancellationTokenSource ProcessExitedSource = processExitedSource;
 
        /// <summary>
        /// Cancellation source to use to terminate the process.
        /// </summary>
        public readonly CancellationTokenSource ProcessTerminationSource = processTerminationSource;
 
        /// <summary>
        /// Misc disposable object to dispose when the object is disposed.
        /// </summary>
        private readonly IReadOnlyList<IDisposable> _disposables = disposables;
 
        public void Dispose()
        {
            Clients.Dispose();
            ProcessTerminationSource.Dispose();
            ProcessExitedSource.Dispose();
 
            foreach (var disposable in _disposables)
            {
                disposable.Dispose();
            }
        }
 
        /// <summary>
        /// Waits for the application process to start.
        /// Ensures that the build has been complete and the build outputs are available.
        /// </summary>
        public async ValueTask WaitForProcessRunningAsync(CancellationToken cancellationToken)
        {
            await Clients.WaitForConnectionEstablishedAsync(cancellationToken);
        }
 
        public async ValueTask<int> TerminateAsync()
        {
            ProcessTerminationSource.Cancel();
            return await RunningProcess;
        }
    }
}