anchor.diff:  
          let computation =
              async { 
  -               let cts = ref (new CancellationTokenSource())
  -               startUpdate !cts
  +               let mutable cts = new CancellationTokenSource()
  +               startUpdate cts
   
                  while true do
  -                   do! Async.AwaitEvent events
  +                   //let e = events
  +                   do! triggered.WaitAsync()
  +                   triggered.Reset()
  +                   //Logging.logInfo <| fun _ -> "!!!!!!!!! awaited"
                      if not skipTimerDelay then
                          startNewTimer()
                          do! awaitPauseAfterChange()
  -                   (!cts).Cancel()
  -                   (!cts).Dispose()
  -                   cts := new CancellationTokenSource()
  -                   startUpdate !cts }
  +                   cts.Cancel()
  +                   cts.Dispose()
  +                   cts <- new CancellationTokenSource()
  +                   startUpdate cts 
  +           }
          
          Async.StartInThreadPoolSafe (computation, tokenSource.Token)
   
  
positive.code:                 do! Async.SwitchToContext ctx
              })
  
  type DocumentEventListener (events: IEvent<unit> list, delayMillis: uint16, update: CallInUIContext -> Async<unit>) =
      // Start an async loop on the UI thread that will execute the update action after the delay
      do if List.isEmpty events then invalidArg "events" "Events must be a non-empty list"
      let events = events |> List.reduce Event.merge
      let timer = DispatcherTimer(DispatcherPriority.ApplicationIdle, Interval = TimeSpan.FromMilliseconds (float delayMillis))
      let tokenSource = new CancellationTokenSource()
      let mutable disposed = false
  
negative.code: open System.Threading
  open System.Windows.Threading
  open FSharpVSPowerTools
  open System.Diagnostics
  open System.Threading.Tasks
  
  [<RequireQualifiedAccess>]
  module ViewChange =    
  