2017-04-22 15 views
0

私は自分のコンテナ内に3000ファイルを持っています。私のgridviewではコンテナブロブのリストを表示していますが、3000はあまりにも多く、パフォーマンスには不向きです。Azure Blobリストページング

私は私のグリッドページサイズが

:)私は多くのコードをpageindexchangingに必要gridview.Ofコースで私の最初のページのための私のコンテナ内の最初の50ブロブを表示します50であるか、それをしない、例をページングコードが必要パフォーマンスに影響しませんか?

答えて

1

あなたの説明によると、お客様の要件を満たすために、AzureストレージSDKのListBlobsSegmentedメソッドを使用することをお勧めします。

ListBlobsSegmentedを含むmaxResultsパラメータ。

maxResults: 一度に返される結果の最大数を示す負でない整数値。操作あたりの制限値は5000までです。この値がNULLの場合、結果の最大数は

ページが最初に読み込まれたときに50レコードを検索することができます。

ページインデックスが変更されたときに、グリッドビューインデックスに従って適切な数のブロブを検索する検索メソッドを呼び出すことができます。

注意:パフォーマンスを含めるために、すべてのブロブを一度に取得して、コンテナ内のブロブの数を知ることはありません。だから、私たちは塊の総数を知ることができませんでした。あなたが100塊を初めて検索することができます。顧客がページ2をクリックすると、次の100塊を検索します。ここで

は、例のデモで、それはあなたにいくつかのヒントを与える願っています: GridViewの:

<asp:GridView ID="GridView1" AllowPaging="true" PageSize="50" OnPageIndexChanging="GridView1_PageIndexChanging" runat="server"> 
</asp:GridView> 

の背後にあるコード:

BlobContinuationToken continuationToken = null; 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       //1*100 is the numebr of blobs you will list 
       ListBlobResult(1*100); 
      } 
     } 

     public void ListBlobResult(int index) 
     { 
      CloudStorageAccount storageAccount = CloudStorageAccount.Parse("connectionstring"); 
      var client = storageAccount.CreateCloudBlobClient(); 
      var container = client.GetContainerReference("foo2"); 
      string prefix = null; 
      bool useFlatBlobListing = true; 
      BlobListingDetails blobListingDetails = BlobListingDetails.All; 
      // int maxBlobsPerRequest = 50; 
      List<IListBlobItem> blobs = new List<IListBlobItem>(); 

      if (index <= 5000) 
      { 
       var listingResult = container.ListBlobsSegmented(prefix, useFlatBlobListing, blobListingDetails, index, continuationToken, null, null); 
       continuationToken = listingResult.ContinuationToken; 
       blobs.AddRange(listingResult.Results); 
      } 
      else 
      { 
       do 
       { 
        var listingResult = container.ListBlobsSegmented(prefix, useFlatBlobListing, blobListingDetails, index, continuationToken, null, null); 
        continuationToken = listingResult.ContinuationToken; 
        blobs.AddRange(listingResult.Results); 
        index = index - 5000; 
       } 
       while (continuationToken != null); 
      } 
      DataTable d1 = new DataTable(); 
      d1.Columns.Add("Id"); 
      d1.Columns.Add("Url"); 
      foreach (var item in blobs) 
      { 
       if (item.GetType() == typeof(CloudBlockBlob)) 
       { 
        CloudBlockBlob blob = (CloudBlockBlob)item; 
        d1.Rows.Add(blob.Name, blob.Uri); 
       } 
      } 

      GridView1.DataSource = d1; 
      GridView1.DataBind(); 
     } 


     protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 
     { 

      GridView1.PageIndex = e.NewPageIndex; 
      //(e.NewPageIndex*100)+100 is the numebr of blobs you will list 
      ListBlobResult((e.NewPageIndex*100)+100);  
     } 

結果: enter image description here

+0

はあなたがしている、知っていますか王様:)ありがとうございます:) –

+0

SasUri.IでコンテナListBlobsSegmentedを取得するのに時間があればそこに問題はありませんが、ユーザーがページをリフレッシュするか、別の1分後に来るときにリストを取得しています。私はいつもSaSとのuriリンクを取得しています。私はコンテナbloblistのviewstatesを持っていますが、私は1000人のユーザを持っています:) –

+0

blobをリストするのにSASを使いたいですか? 「ユーザーがページを更新したとき、または5分後に新しいページが表示されたとき」について詳しく説明してください。私はあなたが新しいスレッドを開始し、より詳細な情報を投稿することをお勧めします、それは私たちが解決策を見つけることがより簡単になります。 –

関連する問題