C# 转换任务<;DbSet<;T>&燃气轮机;任务<;IEnumerable<;T>&燃气轮机;

C# 转换任务<;DbSet<;T>&燃气轮机;任务<;IEnumerable<;T>&燃气轮机;,c#,entity-framework,linq,lambda,C#,Entity Framework,Linq,Lambda,我试图找出为什么第一个代码块出错,而第二个代码块不出错,唯一的区别是第一个代码块在使用任务,而第二个代码块没有。调查了各种来源,但没有得到明确的答案。 有人知道如何修理第一个街区吗 参考下面的链接,但到目前为止没有运气 public任务GetAll() { var资产=Task.Factory.StartNew(()=>\u context.Books); 归还资产; //在“返回资产”上也尝试了toList(),但没有任何区别。 } 公共IEnumerable getall() { var

我试图找出为什么第一个代码块出错,而第二个代码块不出错,唯一的区别是第一个代码块在使用任务,而第二个代码块没有。调查了各种来源,但没有得到明确的答案。 有人知道如何修理第一个街区吗

参考下面的链接,但到目前为止没有运气

public任务GetAll()
{
var资产=Task.Factory.StartNew(()=>\u context.Books);
归还资产;
//在“返回资产”上也尝试了toList(),但没有任何区别。
}
公共IEnumerable getall()
{
var资产=_context.Books;
归还资产;
}

您基本上只需要:

public async Task<IEnumerable<Asset>> GetAllAsync()
{
    return await _context.Books;
}

当您请求遍历
getall
的结果时,或者通过调用
ToList
方法基于此结果创建列表时,您将进行同步调用(一个阻塞调用,当前执行将被冻结,直到您获得请求的结果。在第一种情况下,您释放调用
GetAllAsync()
的线程,当结果可用时,代码将继续在另一个线程或
GetAllAsync()的线程中执行。)
被调用,前提是数据在请求时可用)

您基本上只需要:

public async Task<IEnumerable<Asset>> GetAllAsync()
{
    return await _context.Books;
}

当您请求遍历
getall
的结果时,或者通过调用
ToList
方法基于此结果创建列表时,您将进行同步调用(一个阻塞调用,当前执行将被冻结,直到您获得请求的结果。在第一种情况下,您释放调用
GetAllAsync()
的线程,当结果可用时,代码将继续在另一个线程或
GetAllAsync()的线程中执行。)如果数据在请求时可用,则调用

要修复,只需使任务返回预期类型,即
IEnumerable

public任务GetAll()
{
var资产=Task.Factory.StartNew(()=>(IEnumerable)\u context.Books);
归还资产;
}
公共IEnumerable getall()
{
var资产=_context.Books;
归还资产;
}

但是请注意,它没有任何意义,并且不是使用
任务
异步
/
等待
的正确方法。要解决此问题,只需使任务返回预期类型,即
IEnumerable

public任务GetAll()
{
var资产=Task.Factory.StartNew(()=>(IEnumerable)\u context.Books);
归还资产;
}
公共IEnumerable getall()
{
var资产=_context.Books;
归还资产;
}

但是请注意,它没有任何意义,并且不是使用
任务
异步
/
等待
的正确方法。我知道这是一个旧线程。 在2018年,这段代码帮助了我(可能帮助了其他人):

public异步任务GetAll()
{
var资产=_context.Books.AsEnumerable();
归还资产;
}

我知道这是一条旧线。 在2018年,这段代码帮助了我(可能帮助了其他人):

public异步任务GetAll()
{
var资产=_context.Books.AsEnumerable();
归还资产;
}


您将如何等待DbSet?它不可等待。您好@Christos谢谢您的回答,但由于Evk提到DbSet不可等待,因此编译器会抱怨。仅供参考-我相信您缺少GetAllAsync第一段代码,,,您将如何等待DbSet?它不可等待。您好@Christos谢谢您的回答,但Evk提到的DbSet不可等待等待,因此编译器会抱怨。仅供参考-我相信您缺少GetAllAsync第一块代码,,,为什么在任务中返回_context.Books?有什么意义?它似乎没有任何用处。您可以将_context.Books强制转换为(IEnumerable)inside StartNew可以解决您当前的问题,但问题是您为什么要这样做。@Evk我现在只是熟悉一下任务。这只是一个例子。我将接受您的反馈。@Evk您破解了它。非常感谢。请将其作为答案发布,我将接受它。此外,任何关于改进此代码的建议都将我非常感谢你的回答。你为什么在任务中返回context.Books?有什么意义?它似乎没有什么用处。你可以将context.Books转换为(IEnumerable)inside StartNew可以解决您当前的问题,但问题是您为什么要这样做。@Evk我现在只是熟悉一下任务。这只是一个例子。我将接受您的反馈。@Evk您破解了它。非常感谢。请将其作为答案发布,我将接受它。此外,任何关于改进此代码的建议都将非常感谢您的回答。非常感谢。任何改进此代码的建议都将受到高度欢迎,因为您提到我不应该首先这样做。如果您想异步加载书籍,只需执行_context.Books.ToListAsync()(其中ToListAsync()是EF 6的扩展方法)。如果您熟悉任务,您还必须意识到,在代码中,任务启动后会立即返回_context.Books(它不会进行任何查询或任何操作,只会按原样返回_context.Books)和退出。因此它没有任何有用的工作。我完全同意@Evk。感谢您使用
任务.Factory.StartNew将操作排队以在线程池上运行。它不必要地消耗额外的线程。非常感谢。任何改进此代码的建议都将受到高度欢迎,因为您提到我不应该这样做如果你想异步加载书籍,只需执行context.Books.tolistsync()(其中tolistsync()是EF 6的扩展方法)。如果你熟悉任务,你还必须
public IEnumerable<Asset> GetAlls()
{
    var assets = _context.Books;
    return assets;
}
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;
}
public async Task<IEnumerable<Asset>> GetAll()
{
    var assets = _context.Books.AsEnumerable();
    return assets;
}