public AutoRenewLease(ILoggerFactory loggerFactory, LoggerLevel logLevel, CloudBlob blob, int renewLeaseSeconds = 40, int leaseLengthSeconds = 90)
{
_logger = loggerFactory.Create(GetType(), logLevel);
var autoRenewLease = this;
_blob = blob;
blob.Container.CreateIfNotExist();
try
{
blob.UploadByteArray(new byte[0], new BlobRequestOptions { AccessCondition = AccessCondition.IfNoneMatch("*")});
}
catch (StorageClientException ex)
{
if (ex.ErrorCode != StorageErrorCode.BlobAlreadyExists)
{
if (ex.StatusCode != HttpStatusCode.PreconditionFailed)
throw;
}
}
LeaseId = blob.TryAcquireLease(leaseLengthSeconds);
if (!HasLease)
return;
_cancellationTokenSource = new CancellationTokenSource();
_resetEvent = new ManualResetEvent(false);
Task.Factory.StartNew(() =>
{
try
{
while (true)
{
_resetEvent.WaitOne(TimeSpan.FromSeconds(renewLeaseSeconds));
if (_cancellationTokenSource.IsCancellationRequested)
break;
blob.RenewLease(autoRenewLease.LeaseId);
}
}
catch (Exception e)
{
LeaseId = null; // Release the lease
_logger.Error("Error renewing blob lease", e);
}
}, _cancellationTokenSource.Token);
}