4

我有两个代码示例:

var container = new CloudBlobContainer("address");
var blobs = container.ListBlobs();
foreach (var blob in blobs)
{
    //Do somthing
}

和这个 :

var container = new CloudBlobContainer("address");
var blobs = container.ListBlobs().ToList();
foreach (var blob in blobs)
{
     //Do somthing
}

第二个例子会给出“交易方面”的任何优势吗?
在每个示例中对 blob 存储进行了多少事务?

4

1 回答 1

5

编辑:看来这个问题是参考Martin Ingvar Kofoed Jensen 的博客文章。这个问题和那个问题之间的区别在于调用.Where(...).SingleOrDefault(). 因为 LINQ 是惰性求值的,所以在Container.ListBlobs()它的阶段仍然是一个IEnumerable并且尚未调用 REST API(没有检索到数据)。一旦发生结果操作(例如ToList()SingleOrDefault()),就会下载数据。由于在以下代码中对循环内的惰性列表调用了非惰性操作,因此每次循环迭代都会产生一个事务:

foreach (string filePath in allFilesInStartFolder)
{
    string fileHash = GetFileHashFromCache(filePath, lastSync);

    /* Checking for added files */
    var blob = blobs.Where(b => b.LocalPath == filePath).SingleOrDefault();
    // ^^ This is a non-lazy op on a lazy evalution, so it causes a REST call.
    ....
}

关于实际编写的问题:两个代码片段都将产生一个事务(最多 5,000 个 blob)。我在LinqPad / Fiddler中测试了这两个代码片段,我只看到一个API 调用来生成 blob 列表(用 {mystore} 替换了我们的存储名称):

https://{mystore}.blob.core.windows.net/
    {mystore}?restype=container&comp=list&delimiter=%2F&timeout=90

根据List Blobs REST API的文档,一次调用最多可以返回 5,000 个结果。因此,如果要列出整个容器中的所有 blob,最多需要 (# blobs / 5000) 个事务。

于 2011-10-03T15:38:12.763 回答