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();
}
}