非同期で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ファイルをAzureBLOBにアップロードする必要があります。ファイルの数は10〜50,000で、各ファイルは約10KB〜50KBです。現在、コードスニペットは正常に機能しています。ただし、コールバックでEndUploadFromStreamを呼び出すと、2,000を超えるファイルをアップロードするときに常に例外がスローされます。つまり、uploadメソッドでEndUploadFromStreamを削除し、callback(OnUploadCompletedメソッド)でEndUploadFromStreamを呼び出すと、例外が発生します。以下のような例外メッセージ:
トランスポート接続からデータを読み取れません:接続が閉じられました。、StackTrace:Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result()で
Microsoft.WindowsAzure.StorageClient.CloudBlob.EndUploadFromStream(IAsyncResult asyncResult)で
なぜそれが起こるのかわかりません...皆さんからの回答を期待しています。
ありがとう。