private async Task RefreshInternal()

in resharper/resharper-unity/src/Unity.Rider/Integration/UnityEditorIntegration/UnityRefreshTracker.cs [105:185]


        private async Task RefreshInternal(Lifetime lifetime, RefreshType refreshType)
        {
            myLocks.ReentrancyGuard.AssertGuarded();

            if (myBackendUnityHost.BackendUnityModel.Value == null)
                return;

            if (!myBackendUnityHost.IsConnectionEstablished())
                return;

            var lifetimeDef = Lifetime.Define(lifetime);
            myUnityProcessTracker.UnityProcessId.When(lifetimeDef.Lifetime, (int?)null,
                _ => { lifetimeDef.Terminate(); });

            try
            {
                myLogger.Verbose(
                    $"myPluginProtocolController.UnityModel.Value.Refresh.StartAsTask, force = {refreshType} Started");
                mySolution.GetComponent<BackgroundProgressManager>().AddNewTask(lifetimeDef.Lifetime,
                    BackgroundProgressBuilder.Create()
                        .WithHeader(Strings.UnityRefresher_RefreshInternal_Refreshing_solution_in_Unity_Editor___)
                        .AsIndeterminate().AsNonCancelable());

                var version = myUnityVersion.ActualVersionForSolution.Value;
                try
                {
                    if (version != null && version.Major < 2018)
                    {
                        using (mySolution.GetComponent<VfsListener>().PauseChanges())
                        {
                            try
                            {
                                await myBackendUnityHost.BackendUnityModel.Value.Refresh
                                    .Start(lifetimeDef.Lifetime, refreshType).AsTask();
                            }
                            finally
                            {
                                await myLocks.Tasks.YieldTo(myLifetime, Scheduling.MainGuard);
                            }
                        }
                    }
                    else // it is a risk to pause vfs https://github.com/JetBrains/resharper-unity/issues/1601
                        await myBackendUnityHost.BackendUnityModel.Value.Refresh
                            .Start(lifetimeDef.Lifetime, refreshType).AsTask();
                }
                catch (TaskCanceledException e)
                {
                    myLogger.Warn(e, comment: "connection usually brakes during refresh.");
                    // myBackendUnityProtocol.Connected = false, will follow in milliseconds
                    await myLocks.Tasks.YieldTo(myLifetime, Scheduling.MainGuard);
                    await WaitForStableConnection(lifetimeDef.Lifetime, TimeSpan.FromMilliseconds(250));
                    await myLocks.Tasks.YieldTo(myLifetime, Scheduling.MainGuard);
                }
                finally
                {
                    await myLocks.Tasks.YieldTo(myLifetime, Scheduling.MainGuard);
                    var protocol = await myBackendUnityProtocol.GetValueAsync(lifetimeDef.Lifetime);
                    await protocol.Connected.NextTrueValueAsync(lifetimeDef.Lifetime);
                    myLogger.Trace("await Connected finished.");
                    await myBackendUnityHost.BackendUnityModel.NextValueAsync(lifetimeDef.Lifetime);
                    myLogger.Trace("await for BackendUnityModel finished.");

                    myLogger.Trace($"Refresh, force = {refreshType} Finished");
                    var solution = mySolution.GetProtocolSolution();
                    var solFolder = mySolution.SolutionDirectory;
                    var list = new List<RdPath> { solFolder.ToRd() };
                    await solution.GetFileSystemModel().RefreshPaths
                        .Start(lifetimeDef.Lifetime, new RdFsRefreshRequest(list, true)).AsTask();
                    myLogger.Trace("RefreshPaths.StartAsTask Finished.");
                    await myLocks.Tasks.YieldTo(myLifetime, Scheduling.MainGuard);
                }
            }
            catch (Exception e)
            {
                myLogger.LogException(e);
            }
            finally
            {
                lifetimeDef.Terminate();
            }
        }