如何在Windows应用商店应用程序中将数据上载到azure blob时显示进度条
我已经按照下面的帖子做了分块上传到blob的工作 但这在windows应用商店应用程序或windows 8.1应用程序中不起作用,因为win 8.1应用程序中不支持MemoryStream 无论如何,我已经在上面的线程中修改了代码,并提出了如下内容如何在Windows应用商店应用程序中将数据上载到azure blob时显示进度条,azure,windows-store-apps,bytearray,memorystream,windows-8.1-universal,Azure,Windows Store Apps,Bytearray,Memorystream,Windows 8.1 Universal,我已经按照下面的帖子做了分块上传到blob的工作 但这在windows应用商店应用程序或windows 8.1应用程序中不起作用,因为win 8.1应用程序中不支持MemoryStream 无论如何,我已经在上面的线程中修改了代码,并提出了如下内容 CloudBlobClient myBlobClient = storageAccount.CreateCloudBlobClient(); var filePicker = new FileOpenPicker()
CloudBlobClient myBlobClient = storageAccount.CreateCloudBlobClient();
var filePicker = new FileOpenPicker();
filePicker.FileTypeFilter.Add("*");
var file = await filePicker.PickSingleFileAsync();
string output = string.Empty;
var fileName = file.Name;
myBlobClient.SingleBlobUploadThresholdInBytes = 1024 * 1024;
CloudBlobContainer container = myBlobClient.GetContainerReference("files");
//container.CreateIfNotExists();
CloudBlockBlob myBlob = container.GetBlockBlobReference(fileName);
var blockSize = 256 * 1024;
myBlob.StreamWriteSizeInBytes = blockSize;
var fileProp = await file.GetBasicPropertiesAsync();
var bytesToUpload = fileProp.Size;
var fileSize = bytesToUpload;
if (bytesToUpload < Convert.ToUInt64(blockSize))
{
CancellationToken ca = new CancellationToken();
var ado = myBlob.UploadFromFileAsync(file).AsTask();
await
//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;
ulong startPosition = 0;
ulong bytesUploaded = 0;
do
{
var bytesToRead = Math.Min(Convert.ToUInt64(blockSize), bytesToUpload);
var blobContents = new byte[bytesToRead];
using (Stream fs = await file.OpenStreamForWriteAsync())
{
fs.Position = Convert.ToInt64(startPosition);
fs.Read(blobContents, 0, (int)bytesToRead);
//var iStream = fs.AsInputStream();
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, fs.AsRandomAccessStream(), null).AsTask();
await ado.ContinueWith(t =>
{
bytesUploaded += bytesToRead;
bytesToUpload -= bytesToRead;
startPosition += bytesToRead;
index++;
double percentComplete = (double)bytesUploaded / (double)fileSize;
output += (percentComplete * 100).ToString() + ",";
// AppModel.TasksFormObj.SetProgress(percentComplete * 100);
// 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).AsTask();
pbl.ContinueWith(t =>
{
//Console.WriteLine("Blob uploaded completely.");
});
}
}
然后,在最后一次提交时,在myBlob.PutBlockListAsync(blockIds)之后引发的错误指定的块列表无效
因此,请有人帮助我找出我做错了什么,或者什么可能的解决方案可以让它100%工作。像这样使用AsTask()
CancellationTokenSource _cts;
_cts = new CancellationTokenSource();//<--In Constructor
var progress = new Progress<double>(TranscodeProgress);
await var ado = myBlob.UploadFromFileAsync(file).AsTask(_cts.Token, progress);
CancellationTokenSource\u;
_cts=新的CancellationTokenSource()// 像这样使用AsTask()
CancellationTokenSource _cts;
_cts = new CancellationTokenSource();//<--In Constructor
var progress = new Progress<double>(TranscodeProgress);
await var ado = myBlob.UploadFromFileAsync(file).AsTask(_cts.Token, progress);
CancellationTokenSource\u;
_cts=新的CancellationTokenSource()//我刚刚尝试在Visual Studio 2013中创建一个Windows应用商店应用程序,MemoryStream对我可用。这是我尝试创建的:。我刚刚尝试在Visual Studio 2013中创建一个Windows应用商店应用程序,我可以使用MemoryStream。这就是我试图创建的内容:。