我对异步上传 blob 的问题感到困惑,希望在这里找到答案。
请先看看我的代码片段,
public void UploadMultipleBlobs(List<string> filelocations, string containerName, AsyncCallback callback = null, string path = null)
{
try
{
Parallel.ForEach(filelocations, fileLocation =>
{
//File to Stream
MemoryStream str = new MemoryStream();
byte[] file = File.ReadAllBytes(fileLocation);
str.Write(file, 0, file.Length);
str.Seek(0, SeekOrigin.Begin);
//Operations
if (callback == null)
callback = new AsyncCallback(OnUploadCompleted);
BlobRequestOptions blobRequestOptions = new BlobRequestOptions();
blobRequestOptions.Timeout = new TimeSpan(1, 0, 0);
blobRequestOptions.RetryPolicy = retry;
CloudBlob currentBlob = container.GetBlobReference(blobName);
var result = currentBlob.BeginUploadFromStream(str, blobRequestOptions, callback, new Object[] { currentBlob, str });
currentBlob.EndUploadFromStream(result);
});
}
catch
{
throw;
}
}
private void OnUploadCompleted(IAsyncResult result)
{
try
{
// Get array passed to callback
Object[] states = (Object[])result.AsyncState;
var blob = (CloudBlob)states[0];
var stream = (MemoryStream)states[1];
// End the operation
//blob.EndUploadFromStream(result);
// Close the stream
stream.Close();
}
catch
{
throw;
}
}
我需要将 mutil 文件上传到 Azure blob,文件数可能为 10-50,000 个,每个文件约为 10KB-50KB。代码片段目前对我来说很好。但是,如果我在回调中调用 EndUploadFromStream,它在上传超过 2,000 个文件时总是会抛出异常。我的意思是,如果我在上传方法中删除 EndUploadFromStream 并在回调(OnUploadCompleted 方法)中调用 EndUploadFromStream,则会发生异常。异常信息如下:
无法从传输连接读取数据:连接已关闭。,StackTrace:在 Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result()
在 Microsoft.WindowsAzure.StorageClient.CloudBlob.EndUploadFromStream(IAsyncResult asyncResult)
我不知道为什么会这样......希望得到你们的答案。
谢谢。