handle ignoring events better
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user