handle ignoring events better

This commit is contained in:
Matt Parker
2025-10-10 18:09:15 +10:00
parent f65ad7f18c
commit 6474150b07
3 changed files with 16 additions and 10 deletions

View File

@@ -76,15 +76,11 @@ public class IdeFileManager
private static async Task WriteAllText(SharpIdeFile file, string text)
{
file.SuppressDiskChangeEvents.Value = true;
file.SuppressDiskChangeEvents = true;
await File.WriteAllTextAsync(file.Path, text);
Console.WriteLine($"Saved file {file.Path}");
_ = Task.Delay(300).ContinueWith(_ =>
{
Console.WriteLine($"Re-enabling disk change events for {file.Path}");
file.SuppressDiskChangeEvents.Value = false;
Console.WriteLine($"Value is now {file.SuppressDiskChangeEvents.Value}");
}, CancellationToken.None, TaskContinuationOptions.RunContinuationsAsynchronously, TaskScheduler.Default);
file.LastIdeWriteTime = DateTimeOffset.Now;
file.SuppressDiskChangeEvents = false;
}
public async Task SaveAllOpenFilesAsync()

View File

@@ -15,7 +15,16 @@ public class IdeFileChangeHandler
{
var sharpIdeFile = SolutionModel.AllFiles.SingleOrDefault(f => f.Path == filePath);
if (sharpIdeFile is null) return;
if (sharpIdeFile.SuppressDiskChangeEvents.Value is true) return;
if (sharpIdeFile.SuppressDiskChangeEvents is true) return;
if (sharpIdeFile.LastIdeWriteTime is not null)
{
var now = DateTimeOffset.Now;
if (now - sharpIdeFile.LastIdeWriteTime.Value < TimeSpan.FromMilliseconds(300))
{
Console.WriteLine($"IdeFileChangeHandler: Ignored - {filePath}");
return;
}
}
Console.WriteLine($"IdeFileChangeHandler: Changed - {filePath}");
await sharpIdeFile.FileContentsChangedExternallyFromDisk.InvokeParallelAsync();
}

View File

@@ -16,7 +16,8 @@ public class SharpIdeFile : ISharpIdeNode, IChildSharpIdeNode
public bool IsCsharpFile => Path.EndsWith(".cs", StringComparison.OrdinalIgnoreCase);
public bool IsRoslynWorkspaceFile => IsCsharpFile || IsRazorFile || IsCshtmlFile;
public required ReactiveProperty<bool> IsDirty { get; init; }
public required ReactiveProperty<bool> SuppressDiskChangeEvents { get; init; }
public required bool SuppressDiskChangeEvents { get; set; } // probably has concurrency issues
public required DateTimeOffset? LastIdeWriteTime { get; set; }
public EventWrapper<Task> FileContentsChangedExternallyFromDisk { get; } = new(() => Task.CompletedTask);
public EventWrapper<Task> FileContentsChangedExternally { get; } = new(() => Task.CompletedTask);
@@ -27,7 +28,7 @@ public class SharpIdeFile : ISharpIdeNode, IChildSharpIdeNode
Name = name;
Parent = parent;
IsDirty = new ReactiveProperty<bool>(false);
SuppressDiskChangeEvents = new ReactiveProperty<bool>(false);
SuppressDiskChangeEvents = false;
allFiles.Add(this);
}
}