【问题标题】:Asynchronous Save/Return of list in repository [duplicate]存储库中列表的异步保存/返回[重复]
【发布时间】:2018-11-29 15:37:07
【问题描述】:

我正在开发 .NET Core 中的 WebAPI,为了访问数据库,我有一个同步存储库模式实现。现在我正在将方法从同步更改为异步,并且遇到了一些我不明白的问题。

我有这个功能:

public List<object> Save(List<T> entities)
    {
        return entities.Select(x => _session.Save(x)).ToList();
    }

如何使其异步?

第二个功能:

 public async Task<List<Comment>> GetCommentsForPost(long postId)
    {
        try
        {
            return await (List<Comment>)_session.QueryOver<Comment>()
            .Where(x => x.PostId.Id == postId && !x.Deleted)
            .OrderBy(x => x.Created).Desc
            .ListAsync().Result;
        }
        catch (Exception e)
        {
            logger.Error(e.Message + e.InnerException + e.StackTrace);
            return null;
        }          
    }

这两个功能不相关。我把它们放了,这样我就可以显示我有问题的地方。 如您所见,我正在尝试使其在第二个功能中起作用。我面临的所有问题都产生相同的错误:“...不包含 GetAwaiter() 的定义,并且没有可访问的扩展方法 GetAwaiter() 接受...”

有人可以告诉我这应该如何正确完成吗?

编辑: 这是我发现的有效方法:

var t = entities.Select(async x => await _session.SaveAsync(x)).ToList();
        await Task.WhenAll(t);
        return t;

但是我不确定这是否是一个好方法?

【问题讨论】:

  • 不相关,但不要这样做:logger.Error(e.Message + e.InnerException + e.StackTrace); 这样做:logger.Error(e.ToString());
  • 好的,谢谢你,这是无关的,但猜它很有帮助:) 太好了,谢谢

标签: c# asynchronous fluent-nhibernate repository-pattern


【解决方案1】:

功能1:

public async Task<List<object>> Save(List<T> entities)
{
    return await entities.Select(x => _session.Save(x)).ToListAsync();
}

功能2:只需删除.Result;

【讨论】:

  • 另外,永远不要使用.Result。曾经。如果它必须是同步的,至少使用.GetAwaiter().GetResult()
  • 我不确定这是否应该作为评论,但是:Function1:“IEnumerable 不包含 ToListAsync() 的定义;和 Function2:无法从系统转换...线程..任务列表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 2020-06-15
相关资源
最近更新 更多