使用以下代码我试图将实体插入到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秒的延迟。我想我在这里做错了。任何评论都非常感谢。
答案 0 :(得分:0)
必定要发生一些事情。我已经运行了在5秒内插入2000个实体的测试,没有任何问题。
正如@smarx已经提到的,您可以设置一些影响性能的网络参数。有一个blog post with all of them。这一刻似乎有所下降,但希望它会回来。以下配置代码段体现了该文章中的一些建议,可能对您有所帮助:
<system.net>
<connectionManagement>
<add address="*" maxconnection="45"/>
</connectionManagement>
<settings>
<servicePointManager useNagleAlgorithm="true" expect100Continue="false" />
</settings>
</system.net>
由于您正在使用“任务”,因此您还可以检查是否正在耗尽ThreadPool。使用Perfmon检查测试运行时有多少线程处于活动状态。如果计数继续攀升,或者数量非常大,那么这可能是你的问题。在这种情况下,您可以尝试跳过使用任务,并自己跟踪开始/结束调用的异步结果。