C# 5 中异步模式的一个缺点是任务不是协变的,IE 没有ITask<out TResult>
我注意到我的开发人员经常这样做
return await SomeAsyncMethod();
来解决这个问题。
这个板条箱究竟会对性能产生什么影响?没有 I/O 或线程产量,它只会等待并将其转换为正确的协变,在这种情况下,异步框架将在幕后做什么?会有任何线程上下文切换吗?
编辑:更多信息,此代码不会编译
public class ListProductsQueryHandler : IQueryHandler<ListProductsQuery, IEnumerable<Product>>
{
private readonly IBusinessContext _context;
public ListProductsQueryHandler(IBusinessContext context)
{
_context = context;
}
public Task<IEnumerable<Product>> Handle(ListProductsQuery query)
{
return _context.DbSet<Product>().ToListAsync();
}
}
因为 Task 不是协变的,而是添加了 await ,它会将其转换为正确的 IEnumerable 而不是 ToListAsync 返回的 List
ConfigureAwait(false)
域代码中的任何地方都不是一个可行的解决方案,但我肯定会将它用于我的低级方法,例如
public async Task<object> Invoke(Query query)
{
var dtoType = query.GetType();
var resultType = GetResultType(dtoType.BaseType);
var handler = _container.GetInstance(typeof(IQueryHandler<,>).MakeGenericType(dtoType, resultType)) as dynamic;
return await handler.Handle(query as dynamic).ConfigureAwait(false);
}