anchor.diff:            ( UseShellExecute = false, CreateNoWindow = true, FileName=exePath, 
               Arguments = arguments, WindowStyle = ProcessWindowStyle.Hidden )
       
  -    // Start the process and wait until it starts & deletes temp file
  +    // Start the process and wait until it is initialized
  +    // (after initialization, the process deletes the temp file)
       let p = Process.Start(startInfo)
  -    try Async.RunSynchronously(waitUntilDeleted tempFile, 20*1000)
  -    with :? System.TimeoutException ->
  +    if not(waitUntilFileDeleted tempFile (20.*1000.)) then
           failwith
             ( "Failed to start the R.NET server within 20 seconds." +
               "To enable logging set RPROVIDER_LOG to an existing file name." )
  
positive.code: /// Thrown when we want to show the specified string as a friendly error message to the user
  exception RInitializationError of string
  
  /// Asynchronously waits until the specifid file is deleted using FileSystemWatcher
  let waitUntilDeleted file = async {
      use watcher = 
          new FileSystemWatcher
            ( Path.GetDirectoryName(file), Path.GetFileName(file), 
              EnableRaisingEvents=true )
      let! _ = Async.AwaitEvent(watcher.Deleted)
      return () }
  
  
  /// Creates a new channel name in the format: RInteropServer_<pid>_<time>_<random>
  let newChannelName() = 
  
negative.code:         with _ -> ()
  
      // Log some information about the process first
      Logging.logf 
          "Starting server '%s' with arguments '%s' (exists=%b)" 
          exePath arguments (File.Exists(exePath))
  
      // If we are running on Mono, then the safer way to start the process 
      // seems to be to use 'mono /foo/bar/RProvider.Server.exe'
  