File: EditorConfigSettings\SettingsEditorPane.SearchTask.cs
Web Access
Project: src\src\VisualStudio\Core\Def\Microsoft.VisualStudio.LanguageServices_pxr0p0dn_wpftmp.csproj (Microsoft.VisualStudio.LanguageServices)
// 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.Threading.Tasks;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Shell.TableControl;
using Microsoft.VisualStudio.Threading;
 
namespace Microsoft.VisualStudio.LanguageServices.EditorConfigSettings;
 
internal sealed partial class SettingsEditorPane
{
    internal class SearchTask : VsSearchTask
    {
        private readonly IThreadingContext _threadingContext;
        private readonly IWpfTableControl[] _controls;
 
        public SearchTask(uint dwCookie,
                          IVsSearchQuery pSearchQuery,
                          IVsSearchCallback pSearchCallback,
                          IWpfTableControl[] controls,
                          IThreadingContext threadingContext)
            : base(dwCookie, pSearchQuery, pSearchCallback)
        {
            _threadingContext = threadingContext;
            _controls = controls;
        }
 
        protected override void OnStartSearch()
        {
            _ = _threadingContext.JoinableTaskFactory.RunAsync(
                async () =>
                {
                    await _threadingContext.JoinableTaskFactory.SwitchToMainThreadAsync();
                    foreach (var control in _controls)
                    {
                        _ = control.SetFilter(string.Empty, new SearchFilter(SearchQuery, control));
                    }
 
                    await TaskScheduler.Default;
                    uint resultCount = 0;
                    foreach (var control in _controls)
                    {
                        var results = await control.ForceUpdateAsync().ConfigureAwait(false);
                        resultCount += (uint)results.FilteredAndSortedEntries.Count;
                    }
 
                    await _threadingContext.JoinableTaskFactory.SwitchToMainThreadAsync();
                    SearchCallback.ReportComplete(this, dwResultsFound: resultCount);
                });
        }
 
        protected override void OnStopSearch()
        {
            _ = _threadingContext.JoinableTaskFactory.RunAsync(
                async () =>
                {
                    await _threadingContext.JoinableTaskFactory.SwitchToMainThreadAsync();
                    foreach (var control in _controls)
                    {
                        _ = control.SetFilter(string.Empty, null);
                    }
                });
        }
    }
}