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) private static async Task WriteAllText(SharpIdeFile file, string text)
{ {
file.SuppressDiskChangeEvents.Value = true; file.SuppressDiskChangeEvents = true;
await File.WriteAllTextAsync(file.Path, text); await File.WriteAllTextAsync(file.Path, text);
Console.WriteLine($"Saved file {file.Path}"); Console.WriteLine($"Saved file {file.Path}");
_ = Task.Delay(300).ContinueWith(_ => file.LastIdeWriteTime = DateTimeOffset.Now;
{ file.SuppressDiskChangeEvents = false;
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);
} }
public async Task SaveAllOpenFilesAsync() public async Task SaveAllOpenFilesAsync()

View File

@@ -15,7 +15,16 @@ public class IdeFileChangeHandler
{ {
var sharpIdeFile = SolutionModel.AllFiles.SingleOrDefault(f => f.Path == filePath); var sharpIdeFile = SolutionModel.AllFiles.SingleOrDefault(f => f.Path == filePath);
if (sharpIdeFile is null) return; 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}"); Console.WriteLine($"IdeFileChangeHandler: Changed - {filePath}");
await sharpIdeFile.FileContentsChangedExternallyFromDisk.InvokeParallelAsync(); 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 IsCsharpFile => Path.EndsWith(".cs", StringComparison.OrdinalIgnoreCase);
public bool IsRoslynWorkspaceFile => IsCsharpFile || IsRazorFile || IsCshtmlFile; public bool IsRoslynWorkspaceFile => IsCsharpFile || IsRazorFile || IsCshtmlFile;
public required ReactiveProperty<bool> IsDirty { get; init; } 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> FileContentsChangedExternallyFromDisk { get; } = new(() => Task.CompletedTask);
public EventWrapper<Task> FileContentsChangedExternally { get; } = new(() => Task.CompletedTask); public EventWrapper<Task> FileContentsChangedExternally { get; } = new(() => Task.CompletedTask);
@@ -27,7 +28,7 @@ public class SharpIdeFile : ISharpIdeNode, IChildSharpIdeNode
Name = name; Name = name;
Parent = parent; Parent = parent;
IsDirty = new ReactiveProperty<bool>(false); IsDirty = new ReactiveProperty<bool>(false);
SuppressDiskChangeEvents = new ReactiveProperty<bool>(false); SuppressDiskChangeEvents = false;
allFiles.Add(this); allFiles.Add(this);
} }
} }