fix(adminui,client): error boundary inside the interactive scope, stale-commit OnSaved, AbCip browse delay emit, DisposeBridge cancel (review R3)
M1: PageErrorBoundary wraps the body of every InteractiveServer page; the inert layout boundary is removed. m1: DisposeBridge cancels its CTS when the 5 s wait times out. m2: a CSV import that commits after the modal closed still raises OnSaved. m3: document SecurityMode=None no-fallback in Client.CLI.md / Client.UI.md. m4: browsePageDelayMs written only when loaded or changed; negative flagged. Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
@@ -29,7 +29,13 @@ internal static class DisposeBridge
|
||||
using var cts = new CancellationTokenSource(Timeout);
|
||||
try
|
||||
{
|
||||
Task.Run(() => work(cts.Token), cts.Token).Wait(Timeout);
|
||||
var task = Task.Run(() => work(cts.Token), cts.Token);
|
||||
// Observe a late fault so it never surfaces as an unobserved-task exception.
|
||||
_ = task.ContinueWith(t => _ = t.Exception, TaskContinuationOptions.OnlyOnFaulted);
|
||||
// The CTS's own timer and this Wait race: when Wait loses, `using` would dispose the CTS before
|
||||
// the token ever fired, leaving the work running while the caller goes on to dispose the session.
|
||||
// Cancel explicitly so the in-flight Close/Delete is told to stop.
|
||||
if (!task.Wait(Timeout)) { cts.Cancel(); }
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user