2016-05-17 16 views
0

私は、ユーザーが画像をアップロードすることができ、私はAzureブロブに格納するWeb APIプロジェクトを持っています。コードは次のとおりです。Azure Blobコンテナスレッドセーフ?

public class AzureImageHandler : IImageHandler 
{  
    public async Task<string> StoreImage(byte[] image) 
    { 
     var storageAccount = CloudStorageAccount.Parse(
      CloudConfigurationManager.GetSetting("StorageConnectionString")); 

     var blobClient = storageAccount.CreateCloudBlobClient(); 

     // Retrieve a reference to a container. 
     var container = blobClient.GetContainerReference("images"); 

     // Create the container if it doesn't already exist. 
     container.CreateIfNotExists(); 

     container.SetPermissions(
      new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob }); 

     // Retrieve reference to a blob named "myblob". 
     var blockBlob = container.GetBlockBlobReference("myblob"); 

     await blockBlob.UploadFromByteArrayAsync(image, 0, image.Length); 

     return blockBlob.Uri.ToString(); 
    } 
} 

私はDIをAutofacを使用してセットアップしていますが、いずれかのコードがスレッドセーフであるかどうか疑問に思っています。つまり、すべての要求が新しいBLOBへの参照を取得するために使用するシングルトンコンテナを持つことはできますか?またはこのメソッド全体を毎回実行する必要がありますか? CloudStorageAccount/BlobClient/Containerがスレッドセーフであるかどうかはわかりませんでした。 CloudBlobContainerクラスのドキュメントから

おかげ

答えて

3

(Visual BasicではShared)この型のpublic staticメンバーは 、スレッドセーフです。どのインスタンスメンバーもスレッド が安全であるとは保証されません。

他のクラスでも同様のことが分かります。

私は可能性がある場合、私は2つの提案をしたいと思います:コードの2行に続き

container.CreateIfNotExists(); 

container.SetPermissions(
    new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob }); 

は、リクエストごとに実行されます。ブロブコンテナがストレージアカウントに存在することがかなり確かな場合は、これらの行がネットワークコールを行い、システムの速度を低下させる可能性があるため、これらのコード行を削除することができます。すべてのユーザーが同じコンテナにファイルをアップロードしている場合は、アプリケーションの起動時にこのコードを移動できます。

関連する問題