我可以通过两种方式继续声明/使用异步方法。我们看看......
方式1
假设我有一个方法(声明)
Class MyClass
{
...
protected IDbSet<TEntity> IDbSet;
...
public virtual Task<TEntity> GetFirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate)
{
return IDbSet.FirstOrDefaultAsync(predicate);
}
}
(消费)
public async Task<MyViewModel> GetItemByNumber(int itemNumber)
{
var model = await GetFirstOrDefaultAsync(c => c.ItemNumber == itemNumber);
if (model == null)
return new MyViewModel();
return AutoMapper.Mapper.Map<Model, MyViewModel>(model);
}
方式2
(声明)
Class MyClass
{
...
protected IDbSet<TEntity> IDbSet;
...
public virtual async /* added this here */ Task<TEntity> GetFirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate)
{
// now returning the awaited result
return await /*added here*/ IDbSet.FirstOrDefaultAsync(predicate);
}
}
(消费)
public async Task<MyViewModel> GetItemByNumber(int itemNumber)
{
var model = await GetFirstOrDefaultAsync(c => c.ItemNumber == itemNumber);
if (model == null)
return new MyViewModel();
return AutoMapper.Mapper.Map<Model, MyViewModel>(model);
}
现在,正如您所看到的,我在两种情况下都以相同的方式使用方法,但我已经以不同的方式声明了它们。在第一个,我正在返回任务,在第二个,我正在返回等待的结果我不确定哪个实际上是异步的(或者它们两个都是)。为了让它更加令人困惑,visual studio intellisense说,(在这两种情况下)等待。
所以我想知道,
1)两个版本有什么区别?
2)其中一个是否比另一个更快/更慢?
3)哪一个是首选的,为什么?
4)他们都是异步(我猜这个答案是肯定的,但只是为了确定)
编辑/更新
我已经阅读了这个被标记为重复的问题。我也经历了this,this one和this one。虽然他们确实帮我解决了一些问题,但仍有一些问题尚不清楚。
1)我理解差异在disposing pattern。 Deadlocking and exception handling。
2)根据some answers,(当然,only under certain circumstances)任务版本应该快速编译/运行。
3)第一个问题的答案(关于异常处理和在同步上下文中的发布应该是解决这个问题的因素,同时,如果你需要在同一个方法中等待其他任务,那么在this answer)
4) 我仍然不清楚这个。根据this answer,(第二点)第一个(方式1)不是aysnc,而第二个是。我也尝试阅读答案中提到的文章,但仍然无法清楚地了解第一个如何不异步执行。如果有人能帮助我理解这最后一个很难解决的难题。
答案 0 :(得分:0)
根据这个答案,(第二点)第一个(方式1)不是aysnc,而第二个是。
答案是对的。他们都是异步的。