[英]The 'await' operator can only be used within an async lambda expression error
[英]Error in using await operator within an async lambda expression
我正在尝试使用Parallel.For和async await将一些任意GPS数据(1.5亿条记录)加载到Azure表存储中。 但是我在第一个await语句中收到以下错误:
'await'运算符只能在异步lambda表达式中使用。 考虑使用'async'修饰符标记此lambda表达式。
这是我的代码:
private static async Task GenerateGpsPointsForTruckAsync(int counter, CloudTableClient tableClient)
{
// Create a dummy VIN
string vin = counter.ToString("D17");
Random random = new Random();
DateTime start = new DateTime(2010, 1, 1);
int range = (DateTime.Today - start).Milliseconds;
// Create the batch operation.
TableBatchOperation batchOperation = new TableBatchOperation();
// Prepare 10 batches of 100 GPS points
Parallel.For(0, 10, i =>
{
for (int j = 0; j < 99; j++)
{
Location location = new Location(vin, start.AddDays(random.Next(range)).ToString());
location.Coordinates = new GeoCoordinate(random.Next(30, 45), random.Next(75, 100));
batchOperation.Insert(location);
}
await Task.Run(async () =>
{
await LoadGpsPointsForTruckAsync(tableClient, batchOperation);
});
});
}
我在Stack Overflow上查看了一些解决方案,但它们似乎并不适合我。
你不能在Parallel.For
使用async-await,因为它比async更旧并且不等待它(你可能不想要)。
如果要创建在线程池上运行的多个任务,可以通过Task.WhenAll
多次调用Task.Run
来执行此操作,以便您可以await
所有这些任务完成:
await Task.WhenAll(Enumerable.Range(0,10).Select(i => Task.Run(() => Foo(i))));
当操作是同步时,这是合适的。 如果它是异步的,除非你有理由这样做,否则你不应该将它卸载到线程池中。 您只需调用方法并等待结果:
await Task.WhenAll(Enumerable.Range(0,10).Select(i => FooAsync(i)));
Parallel.For
期望你将lambda标记为async
,因为你的await Task.Run
:
Parallel.For(0, 10, async () => /* code */)
但是, async-await
与Parallel
不兼容,因为它通过Action
委托将它的lambda转换为async void
。
似乎LoadGpsPointsForTruckAsync
本身是异步的,你可以保存自己的并行循环:
var coordinateTasks = Enumerable.Range(0, 100).Select(_ =>
{
Location location = new Location(vin,
start.AddDays(random.Next(range))
.ToString())
{
Coordinates = new GeoCoordinate(random.Next(30, 45),
random.Next(75, 100));
}
batchOperation.Insert(location);
return LoadGpsPointsForTruckAsync(tableClient, batchOperation);
}
await Task.WhenAll(coordinateTasks);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.