/// <summary> Watch a file for changes.
        public IChangeToken Watch(string filter)
        {
            if (_pollingInterval == null)
            {
                return(null);
            }
            _logger.LogDebug("Watching {0}", filter);
            var path  = SplitObjectPath(filter);
            var token = new CloudStorageChangeToken();
            var obj   = GetObject(path);

            Task.Run(() => PollAsync(path, token, obj?.Generation));
            return(token);
        }
        async Task PollAsync(ObjectPath path, CloudStorageChangeToken token,
                             long?generation)
        {
            while (true)
            {
                await Task.Delay(_pollingInterval.Value);

                try
                {
                    var obj = GetObject(path);
                    if (generation != obj?.Generation)
                    {
                        token.NotifyChanged();
                        return;
                    }
                }
                catch (Exception e)
                {
                    _logger.LogError(0, e, "Exception while watching {0}/{1}",
                                     path.BucketName, path.ObjectName);
                }
            }
        }