rastrear por numero localizar gratis google encontrar dispositivo celular c# file-upload azure azure-storage azure-storage-blobs

c# - por - Cómo rastrear el progreso de la carga del archivo asíncrono al almacenamiento azul



rastrear celular gratis (2)

La solución de Gaurav funciona bien y es muy similar a http://blogs.msdn.com/b/kwill/archive/2011/05/30/asynchronous-parallel-block-blob-transfers-with-progress-change-notification.aspx . El desafío con este código es que estás haciendo un trabajo complejo y muy complejo con muy poco manejo de errores. No estoy diciendo que haya nada malo con el código de Gaurav, parece sólido, pero especialmente con el código de comunicación relacionado con la red hay muchas variables y muchos problemas que debes tener en cuenta.

Por esta razón, modifiqué mi blog original para usar el código de carga de la biblioteca del cliente de almacenamiento (bajo la suposición de que el código proveniente del equipo de Azure Storage era más robusto que todo lo que podía escribir) y seguí el progreso usando una clase ProgressStream. Puede ver el código actualizado en http://blogs.msdn.com/b/kwill/archive/2013/03/06/asynchronous-parallel-block-blob-transfers-with-progress-change-notification-2-0 .aspx .

¿Hay alguna forma de seguir el progreso de la carga de archivos al contenedor de almacenamiento de Azure?
Estoy tratando de hacer una aplicación de consola para cargar datos a azul con C #.
Mi Coode por ahora se ve así:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Auth; using Microsoft.WindowsAzure.Storage.Blob; using System.Configuration; using System.IO; using System.Threading; namespace AdoAzure { class Program { static void Main(string[] args) { CloudStorageAccount storageAccount = CloudStorageAccount.Parse( ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString); CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); CloudBlobContainer container = blobClient.GetContainerReference("adokontajnerneki"); container.CreateIfNotExists(); CloudBlobClient myBlobClient = storageAccount.CreateCloudBlobClient(); CloudBlockBlob myBlob = container.GetBlockBlobReference("racuni.adt"); CancellationToken ca = new CancellationToken(); var ado = myBlob.UploadFromFileAsync(@"c:/bo/racuni.adt", FileMode.Open, ca); Console.WriteLine(ado.Status); //Does Not Help Much ado.ContinueWith(t => { Console.WriteLine("It is over"); //this is working OK }); Console.WriteLine(ado.Status); //Does Not Help Much Console.WriteLine("theEnd"); Console.ReadKey(); } } }

Esta porción de código está funcionando bien, pero me encantaría tener algún tipo de barra de progreso, para que los usuarios puedan ver que hay tareas que hacer. ¿Hay algo incorporado en el espacio de nombres de WindowsAzure.Storage.Blob para que pueda usar como conejo del sombrero?


No creo que sea posible porque cargar archivos es una tarea única, y aunque internamente el archivo se divide en múltiples fragmentos y estos fragmentos se cargan, el código realmente espera a que termine toda la tarea.

Una posibilidad sería dividir manualmente el archivo en fragmentos y cargar esos fragmentos de forma asincrónica utilizando el método PutBlockAsync . Una vez que se hayan cargado todos los fragmentos, puede llamar PutBlockListAsync método PutBlockListAsync para confirmar el blob. Por favor, mira el siguiente código que logra que:

using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Auth; using Microsoft.WindowsAzure.Storage.Blob; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials("accountname", "accountkey"), true); static void Main(string[] args) { CloudBlobClient myBlobClient = storageAccount.CreateCloudBlobClient(); myBlobClient.SingleBlobUploadThresholdInBytes = 1024 * 1024; CloudBlobContainer container = myBlobClient.GetContainerReference("adokontajnerneki"); //container.CreateIfNotExists(); CloudBlockBlob myBlob = container.GetBlockBlobReference("cfx.zip"); var blockSize = 256 * 1024; myBlob.StreamWriteSizeInBytes = blockSize; var fileName = @"D:/cfx.zip"; long bytesToUpload = (new FileInfo(fileName)).Length; long fileSize = bytesToUpload; if (bytesToUpload < blockSize) { CancellationToken ca = new CancellationToken(); var ado = myBlob.UploadFromFileAsync(fileName, FileMode.Open, ca); Console.WriteLine(ado.Status); //Does Not Help Much ado.ContinueWith(t => { Console.WriteLine("Status = " + t.Status); Console.WriteLine("It is over"); //this is working OK }); } else { List<string> blockIds = new List<string>(); int index = 1; long startPosition = 0; long bytesUploaded = 0; do { var bytesToRead = Math.Min(blockSize, bytesToUpload); var blobContents = new byte[bytesToRead]; using (FileStream fs = new FileStream(fileName, FileMode.Open)) { fs.Position = startPosition; fs.Read(blobContents, 0, (int)bytesToRead); } ManualResetEvent mre = new ManualResetEvent(false); var blockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(index.ToString("d6"))); Console.WriteLine("Now uploading block # " + index.ToString("d6")); blockIds.Add(blockId); var ado = myBlob.PutBlockAsync(blockId, new MemoryStream(blobContents), null); ado.ContinueWith(t => { bytesUploaded += bytesToRead; bytesToUpload -= bytesToRead; startPosition += bytesToRead; index++; double percentComplete = (double)bytesUploaded / (double)fileSize; Console.WriteLine("Percent complete = " + percentComplete.ToString("P")); mre.Set(); }); mre.WaitOne(); } while (bytesToUpload > 0); Console.WriteLine("Now committing block list"); var pbl = myBlob.PutBlockListAsync(blockIds); pbl.ContinueWith(t => { Console.WriteLine("Blob uploaded completely."); }); } Console.ReadKey(); } } }