private void CreateWorker(BlobJob job)
        {
            var worker = new Worker()
            {
                BlobJob = job,
                SizeInBytes = job.SizeInBytes,
            };
            ExecuteOnUI(() =>
            {
                Workers.Add(worker);
            });

            try
            {
                worker.Thread = new Thread(new ThreadStart(() =>
                {
                    worker.Start = DateTime.Now;
                    try
                    {
                        var storageAccount = CloudStorageAccount.Parse(string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", job.StorageAccount, job.StorageAccountKey));
                        var blobClient = storageAccount.CreateCloudBlobClient();

                        //var serviceProperties = blobClient.GetServiceProperties();
                        //if (!"2012-02-12".Equals(serviceProperties.DefaultServiceVersion))
                        //{
                        //    serviceProperties.DefaultServiceVersion = "2012-02-12";
                        //    blobClient.SetServiceProperties(serviceProperties);
                        //}

                        var containerReference = blobClient.GetContainerReference(job.Container);

                        containerReference.CreateIfNotExists();
                        var blobReference = containerReference.GetBlockBlobReference(job.BlobName);

                        try
                        {
                            if (System.IO.File.Exists(job.File.FullFilePath))
                            {
                                blobReference.FetchAttributes();
                                var fileInfo = new FileInfo(job.File.FullFilePath);
                                if (blobReference.Properties.Length == fileInfo.Length)
                                {
                                    worker.Message = "Same file already exists";
                                    worker.Finish = DateTime.Now;
                                    ArchiveWorker(worker);
                                    return;
                                }
                            }
                        }
                        catch { }

                        if (job.SizeInBytes > 1 * 1024 * 1024)
                        {
                            var blobTransferHelper = new BlobTransferHelper();
                            blobTransferHelper.TransferCompleted += (sender, e) =>
                            {
                                if (!string.IsNullOrEmpty(job.ContentType)
                                    && (job.JobType == BlobJobType.Upload || job.JobType == BlobJobType.SetMetadata))
                                {
                                    blobReference.Properties.ContentType = job.ContentType;
                                    blobReference.SetProperties();
                                }

                                worker.Message = "Success";
                                worker.Finish = DateTime.Now;
                                ArchiveWorker(worker);
                            };
                            blobTransferHelper.TransferProgressChanged += (sender, e) =>
                            {
                                worker.TransferedInBytes = e.BytesSent;
                                worker.SpeedInBytes = e.Speed;
                                worker.TimeRemaining = TimeSpan.FromSeconds(Convert.ToInt32(e.TimeRemaining.TotalSeconds));
                                worker.SizeInBytes = e.TotalBytesToSend;
                            };

                            switch (job.JobType)
                            {
                                case BlobJobType.Upload:
                                    blobTransferHelper.UploadBlobAsync(blobReference, job.File.FullFilePath);
                                    break;
                                case BlobJobType.Download:
                                    Directory.CreateDirectory(Path.GetDirectoryName(job.File.FullFilePath));
                                    blobTransferHelper.DownloadBlobAsync(blobReference, job.File.FullFilePath);
                                    break;
                            }
                        }
                        else
                        {
                            switch (job.JobType)
                            {
                                case BlobJobType.Upload:
                                    blobReference.UploadFromFileAsync(job.File.FullFilePath, FileMode.OpenOrCreate);
                                    break;
                                case BlobJobType.Download:
                                    Directory.CreateDirectory(Path.GetDirectoryName(job.File.FullFilePath));
                                    blobReference.DownloadToFileAsync(job.File.FullFilePath, FileMode.OpenOrCreate);
                                    break;
                            }

                            if (!string.IsNullOrEmpty(job.ContentType)
                                && (job.JobType == BlobJobType.Upload || job.JobType == BlobJobType.SetMetadata))
                            {
                                blobReference.Properties.ContentType = job.ContentType;
                                blobReference.SetProperties();
                            }

                            worker.Message = "Success";
                            worker.TransferedInBytes = worker.SizeInBytes;
                            worker.Finish = DateTime.Now;
                            worker.SpeedInBytes = worker.SizeInBytes / (worker.Finish - worker.Start).TotalSeconds;
                            ArchiveWorker(worker);
                        }
                    }
                    catch (ThreadAbortException)
                    {
                        worker.Message = "Cancelled";
                        worker.Finish = DateTime.Now;
                        ArchiveWorker(worker);
                    }
                    catch (Exception e)
                    {
                        worker.Message = "Error";
                        worker.ErrorMessage = string.Format("{0}", e.ToString());
                        worker.Finish = DateTime.Now;
                        ArchiveWorker(worker);
                        OnJobError(job, e);
                    }
                }));
                worker.Thread.Start();
            }
            catch (Exception e)
            {
                worker.Message = "Error";
                worker.ErrorMessage = string.Format("{0}", e.ToString());
                ArchiveWorker(worker);
                OnJobError(job, e);
            }
        }
 private void ArchiveWorker(Worker worker)
 {
     worker.Thread = null;
     worker.BlobJob.StorageAccountKey = null;
     ExecuteOnUI(() =>
     {
         Workers.Remove(worker);
         WorkersHistory.Add(worker);
     });
 }
        private void CreateFakeWorker(BlobJob BlobJob)
        {
            var worker = new Worker()
            {
                BlobJob = BlobJob,
                SizeInBytes = BlobJob.SizeInBytes,
            };
            ExecuteOnUI(() =>
            {
                Workers.Add(worker);
            });

            var random = new Random();

            worker.SizeInBytes = (Convert.ToInt64(1000000 * random.NextDouble()) + 1000000);

            var backgroundWorker = new Thread(new ThreadStart(() =>
            {
                while (worker.TransferedInBytes < worker.SizeInBytes)
                {
                    ExecuteOnUI(() =>
                    {
                        worker.SpeedInBytes = random.Next(100000);
                        worker.TransferedInBytes += worker.SpeedInBytes;
                        worker.TimeRemaining = TimeSpan.FromSeconds((worker.SizeInBytes - worker.TransferedInBytes) / worker.SpeedInBytes);
                    });
                    Thread.Sleep(1000);
                }
                worker.Message = "Success";
                ArchiveWorker(worker);
            }));
            backgroundWorker.Start();
        }
 public void CancelWorker(Worker worker)
 {
     try
     {
         worker.Thread.Abort();
     }
     catch { }
     ExecuteOnUI(() =>
     {
         Workers.Remove(worker);
     });
 }