如果我返回等待结果与任务包装对象有什么区别?

时间:2016-12-09 19:55:13

标签: c# asynchronous async-await

我可以通过两种方式继续声明/使用异步方法。我们看看......

方式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)他们都是异步(我猜这个答案是肯定的,但只是为了确定)

编辑/更新

我已经阅读了这个被标记为重复的问题。我也经历了thisthis onethis one。虽然他们确实帮我解决了一些问题,但仍有一些问题尚不清楚。

1)我理解差异在disposing patternDeadlocking and exception handling
2)根据some answers,(当然,only under certain circumstances)任务版本应该快速编译/运行。
3)第一个问题的答案(关于异常处理和在同步上下文中的发布应该是解决这个问题的因素,同时,如果你需要在同一个方法中等待其他任务,那么在this answer
4) 我仍然不清楚这个根据this answer,(第二点)第一个(方式1)不是aysnc,而第二个是。我也尝试阅读答案中提到的文章,但仍然无法清楚地了解第一个如何不异步执行。如果有人能帮助我理解这最后一个很难解决的难题。

1 个答案:

答案 0 :(得分:0)

  

根据这个答案,(第二点)第一个(方式1)不是aysnc,而第二个是。

答案是对的。他们都是异步的。