【发布时间】:2016-12-30 23:06:23
【问题描述】:
首先,正如他们所说,我对异步操作有足够的了解是危险的。 Resharper 使用下面的代码向我发出警告,我在 ForEachAsync 处为“响应”对象隐式捕获了闭包。我理解它为什么警告我,但我不确定我的实现是否有什么特别的问题(顺便说一句,这确实有效),或者是否有更合适的方法从 ForEachAsync 中填充“订单”集合。
public async Task<Response<IEnumerable<Order>>> HandleGetOrdersAsync(GetAllOrdersQuery query)
{
Expression<Func<Order, bool>> dateTimeFilter = order =>
order.OrderTime >= query.StartDateTime &&
order.OrderTime <= query.EndDateTime;
Expression<Func<order, bool>> isActiveFilter = order =>
!query.IsComplete ||
order.OrderStatus == OrderStatusName.Complete;
var items = _ctx.orders
.Include(c => c.Customers)
.Include(p => p.Payments)
.Where(dateTimeFilter)
.Where(isActiveFilter)
.OrderBy(n => n.OrderNo)
.Skip(query.PageSize * query.Page)
.Take(query.PageSize)
.Select(o => o);
// ... items count to be performed here ...
var response = new Response<IEnumerable<Order>>();
var orders = new List<Order>();
await items.ForEachAsync(i =>
{
var order = new Order
{
ResultNo = i.OrderNo,
CustomerName = i.Customer.Name,
PaymentType = i.Payment.Type
};
orders.Add(order);
}).ContinueWith(t =>
{
response = new Response<IEnumerable<Order>>(orders);
});
return response;
}
【问题讨论】:
-
为什么你的代码中有
ContinueWith?只需awaitTask并使用它解析的结果。
标签: c# async-await