【发布时间】:2014-11-28 12:51:45
【问题描述】:
我正在运行 10k 个任务,每个任务将一批数据发送到 Azure 存储表。
如果我将下面的第一种方法与 async await 一起使用,它返回正在运行的任务,则任务执行的速度非常慢,并且从几秒爬升到 10、100 秒等变得越来越慢。
如果我使用下面的第二种方法返回新的正在运行的任务,它们运行得非常快!每个任务只需几十毫秒。
为什么会有如此巨大的差异?我错过了什么?
在我的任务创建结束时,我执行了一个简单的 Task.WaitAll(allTasks.ToArray())。
private static async Task ExecuteBatch(TableBatchOperation tableBatchOperation, CloudTable cloudTable, TextWriter log)
{
var stopwatch = Stopwatch.StartNew();
await cloudTable.ExecuteBatchAsync(tableBatchOperation);
stopwatch.Stop();
log.WriteLine("Committed " + tableBatchOperation.Count + " records in " + stopwatch.Elapsed.TotalSeconds + " seconds.");
}
private static Task ExecuteBatch2(TableBatchOperation tableBatchOperation, CloudTable cloudTable, TextWriter log)
{
return Task.Run(() =>
{
var stopwatch = Stopwatch.StartNew();
cloudTable.ExecuteBatch(tableBatchOperation);
stopwatch.Stop();
log.WriteLine("Committed " + tableBatchOperation.Count + " records " + " in " + stopwatch.Elapsed.TotalSeconds + " seconds.");
});
}
之后
【问题讨论】:
-
在您的第二种方法中,您无需等待
cloudTable.ExecuteBatchAsync(tableBatchOperation);完成,它只是触发然后继续。 -
您的第二次尝试完全错误。您衡量的是任务的开始,而不是完成。
-
是的,你是对的。我改为将其更改为 ExecuteBatch(同步版本),并且速度要慢得多。那是一个错字。
标签: c# azure async-await azure-table-storage