File: Services\AsynchronousOperationListener\RemoteAsynchronousOperationListenerService.cs
Web Access
Project: src\src\Workspaces\Remote\ServiceHub\Microsoft.CodeAnalysis.Remote.ServiceHub.csproj (Microsoft.CodeAnalysis.Remote.ServiceHub)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.Shared.TestHooks;
 
namespace Microsoft.CodeAnalysis.Remote;
 
internal sealed class RemoteAsynchronousOperationListenerService : BrokeredServiceBase, IRemoteAsynchronousOperationListenerService
{
    internal sealed class Factory : FactoryBase<IRemoteAsynchronousOperationListenerService>
    {
        protected override IRemoteAsynchronousOperationListenerService CreateService(in ServiceConstructionArguments arguments)
            => new RemoteAsynchronousOperationListenerService(in arguments);
    }
 
    public RemoteAsynchronousOperationListenerService(in ServiceConstructionArguments arguments)
        : base(in arguments)
    {
    }
 
    public ValueTask EnableAsync(bool enable, bool diagnostics, CancellationToken cancellationToken)
    {
        return RunServiceAsync(cancellationToken =>
        {
            AsynchronousOperationListenerProvider.Enable(enable, diagnostics);
            return default;
        }, cancellationToken);
    }
 
    public ValueTask<bool> IsCompletedAsync(ImmutableArray<string> featureNames, CancellationToken cancellationToken)
    {
        return RunServiceAsync(cancellationToken =>
        {
            var workspace = GetWorkspace();
            var exportProvider = workspace.Services.SolutionServices.ExportProvider;
            var listenerProvider = exportProvider.GetExports<AsynchronousOperationListenerProvider>().Single().Value;
 
            return new ValueTask<bool>(!listenerProvider.HasPendingWaiter([.. featureNames]));
        }, cancellationToken);
    }
 
    public ValueTask ExpeditedWaitAsync(ImmutableArray<string> featureNames, CancellationToken cancellationToken)
    {
        return RunServiceAsync(async cancellationToken =>
        {
            var workspace = GetWorkspace();
            var exportProvider = workspace.Services.SolutionServices.ExportProvider;
            var listenerProvider = exportProvider.GetExports<AsynchronousOperationListenerProvider>().Single().Value;
 
            await listenerProvider.WaitAllAsync(workspace, [.. featureNames]).ConfigureAwait(false);
        }, cancellationToken);
    }
}