/// <summary>
        /// Download blob to local file
        /// </summary>
        /// <param name="blob">Source blob object</param>
        /// <param name="filePath">Destination file path</param>
        internal virtual async Task DownloadBlob(long taskId, IStorageBlobManagement localChannel, ICloudBlob blob, string filePath)
        {
            string               activity = String.Format(Resources.ReceiveAzureBlobActivity, blob.Name, filePath);
            string               status   = Resources.PrepareDownloadingBlob;
            ProgressRecord       pr       = new ProgressRecord(OutputStream.GetProgressId(taskId), activity, status);
            DataMovementUserData data     = new DataMovementUserData()
            {
                Data    = blob,
                TaskId  = taskId,
                Channel = localChannel,
                Record  = pr
            };

            BlobDownloadJob downloadJob = new BlobDownloadJob()
            {
                SourceBlob = blob,
                DestPath   = filePath,
            };

            BlobRequestOptions requestOptions = downloadJob.BlobRequestOptions;

            requestOptions.DisableContentMD5Validation = !checkMd5;
            downloadJob.BlobRequestOptions             = requestOptions;

            await this.RunTransferJob(downloadJob, data);

            this.WriteICloudBlobObject(data.TaskId, data.Channel, blob);
        }
        /// <summary>
        /// Download blob to local file
        /// </summary>
        /// <param name="blob">Source blob object</param>
        /// <param name="filePath">Destination file path</param>
        internal virtual async Task<bool> DownloadBlob(long taskId, IStorageBlobManagement localChannel, ICloudBlob blob, string filePath)
        {
            string activity = String.Format(Resources.ReceiveAzureBlobActivity, blob.Name, filePath);
            string status = Resources.PrepareDownloadingBlob;
            ProgressRecord pr = new ProgressRecord(OutputStream.GetProgressId(taskId), activity, status);
            DataMovementUserData data = new DataMovementUserData()
            {
                Data = blob,
                TaskId = taskId,
                Channel = localChannel,
                Record = pr
            };

            BlobDownloadJob downloadJob = new BlobDownloadJob() 
            {
                SourceBlob = blob,
                DestPath = filePath,
            };

            BlobRequestOptions requestOptions = downloadJob.BlobRequestOptions;
            requestOptions.DisableContentMD5Validation = !checkMd5;
            downloadJob.BlobRequestOptions = requestOptions;

            this.EnqueueTransferJob(downloadJob, data);
                        
            return await data.taskSource.Task;
        }