我试图弄清楚为什么第一个代码块出错而第二个块不是唯一的区别是第一个是使用Task而第二个块不是。看了各种来源,但无法得到明确的答案。任何人都知道如何修复第一个块?
提到下面的链接,但到目前为止没有运气How to cast DbSet<T> to List<T> Why DbSet<TEntity> doesn't implement EnumerableAsync
public Task<IEnumerable<Asset>> GetAll()
{
var assets = Task.Factory.StartNew(() => _context.Books);
return assets;
// tried toList<asset>() on "return assets" as well but didnt make any difference.
}
public IEnumerable<Asset> GetAlls()
{
var assets = _context.Books;
return assets;
}
要修复,只需让你的任务返回预期的类型,即IEnumerable<Asset>
:
public Task<IEnumerable<Asset>> GetAll()
{
var assets = Task.Factory.StartNew(() => (IEnumerable<Asset>) _context.Books);
return assets;
}
public IEnumerable<Asset> GetAlls()
{
var assets = _context.Books;
return assets;
}
但请注意,它没有任何意义,并且不是使用Task
和async
/ await
的正确方法。
你基本上只需要这个:
public async Task<IEnumerable<Asset>> GetAllAsync()
{
return await _context.Books;
}
Books
的_context
将是IEnumerable<Asset>
。使用async / await你基本上可以实现异步加载Books
。上述方法与以下方法的基本区别
public IEnumerable<Asset> GetAlls()
{
var assets = _context.Books;
return assets;
}
当你要求迭代GetAlls
的结果或者你通过调用ToList
方法创建一个基于这个结果的列表时,你将进行同步调用(阻塞调用,当前执行将冻结,直到你得到结果在第一种情况下,你释放了调用GetAllAsync()
的线程,当结果可用时,代码的执行将继续在另一个线程上或在调用GetAllAsync()
的线程中,只要数据可用,请求的时刻)
我知道这是旧线程。在2018年这个代码帮助我(可能,它可以帮助其他人):
public async Task<IEnumerable<Asset>> GetAll()
{
var assets = _context.Books.AsEnumerable();
return assets;
}