0

使用以下代码,我尝试将实体插入到 azure 表中。

    public void AddItems<T>(T[] entitis, string tableName) where T : TableServiceEntity
    {
        using (new TimeLogger(_logger, "save items in table " + tableName + ", count: " + entitis.Length + ", duration: {0}"))
        {
            tableName = GetSafeTableName(tableName);
            var items = RemoveDuplicates(entitis).ToArray();

            var tasks = new List<Task>();

            var context = _tableStorage.GetDataServiceContext();

            for (int i = 0; i < items.Length; i++)
            {
                context.AttachTo(tableName, items[i]);
                context.UpdateObject(items[i]);

                if (i % 10 == 0 || i == items.Length - 1)
                {
                    var context1 = context;

                    var task = Task.Factory.FromAsync<DataServiceResponse>(
                        context1.BeginSaveChangesWithRetries,
                        context1.EndSaveChangesWithRetries,
                        context1);

                    tasks.Add(task);

                    context = _tableStorage.GetDataServiceContext();
                }
            }

            Task.WaitAll(tasks.ToArray());
        }
    }

此方法的调用者在多个分区中传递项目。在我的测试中,我发现不同分区中的 450 个项目大约有 7 到 8 秒的延迟。我认为我在这里做错了什么。任何评论都非常感谢。

4

1 回答 1

0

一定有什么事情发生。我已经运行测试,在 5 秒内插入 2000 个实体,完全没有问题。

正如@smarx 已经提到的,您可以设置一些影响性能的网络参数。所有这些都有/曾经有一篇博客文章。它似乎在这一刻下降,但希望它会回来。以下配置片段体现了该文章中的一些建议,可能会对您有所帮助:

<system.net>
    <connectionManagement>
      <add address="*" maxconnection="45"/>
    </connectionManagement>
    <settings>
      <servicePointManager useNagleAlgorithm="true" expect100Continue="false" />
  </settings>
</system.net>

由于您使用的是任务,因此您还可以检查是否耗尽了线程池。使用 Perfmon 检查测试运行时有多少线程处于活动状态。如果计数不断攀升,或达到一个非常大的数字,那么这可能是您的问题。在这种情况下,您可以尝试跳过任务的使用,并自己跟踪 Begin/End 调用的异步结果。

于 2012-08-06T18:06:39.790 回答