anchor.diff:              let updateReachability = Action(fun () -> self.Reachability <- newReachability)
               postToDispatcher.Invoke(updateReachability)
   
  -            Task.Delay(Details.pingInterval).ContinueWith(fun _ -> sendPing()) |> ignore
  +            async {
  +                let delay = int (Details.pingInterval.TotalMilliseconds)
  +                do! Async.Sleep delay
  +                sendPing()
  +            } |> Async.Start
           else
               () // Don't do anything more.
   
  
positive.code: open System.Net.NetworkInformation
  open System.Reactive.Subjects
  open System.Threading
  open System.Threading.Tasks
  
  module DeviceReachability =
      type ReachabilityStatus = Nominal | NotReachable
  
negative.code:     let rec sendPing () =
  
          if terminate = 0 then
              let targetAddress = getAddress.Invoke()
  
              async {
                  try
                      let! pingReply = Async.AwaitTask (ping.SendPingAsync(targetAddress, Details.pingTimeout))
                      handlePingResult pingReply
                  with
                  | :? ObjectDisposedException -> () // Race condition between asynchronous task and dispose.
                  | ex ->
                      Trace.TraceWarning(sprintf "Unexpected exception in DeviceReachability.sendPing: '%s" ex.Message)
              } |> Async.Start
          else
              () // Don't do anything more.
  
  
      and handlePingResult (reply: PingReply) =
  
          if terminate = 0 then
              state <- handleEventFSM DateTime.Now state reply.Status
              let newReachability =
                  match state with
                  | Details.NotReachable -> ReachabilityStatus.NotReachable
  