如何在 Task<T> 函数中等待任务?

How can I await task in Task<T> function?

我找不到正确的方法:

public Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)
{
    // Get all Items
    if (ProjectID == null)
        return database.Table<HWElDocument>().ToListAsync();

    // Or all items meeting a condition
    else
    {
        // This line has to be awaited, I think ?!?
        List<HWDocuProj> projList = await database.Table<HWDocuProj>().Where( item => item.ProjID == ProjectID).ToListAsync();
        // So that I can use the result here:
        return database.Table<HWElDocument>().Where(item => projList.Exists(p => p.ProjID == item.ID)).ToListAsync();
    }
}

由于 await 关键字,编译器要求将函数转换为异步函数。但是我这样做了,因此它拒绝结果是 Task<T'> ... 如果我将 return 类型更改为 async List<HWElDocument'>,则此行会引发错误:

return database.Table<HWElDocument>().ToListAsync();

那么实现这个的正确方法是什么?

无论何时调用异步函数,您都需要“等待”它。您只需在开头放置“await”关键字即可:

return await database.Table<HWElDocument>().Where(item => projList.Exists(p => p.ProjID == item.ID)).ToListAsync();

return await database.Table<HWElDocument>().ToListAsync();

您的方法签名中还需要“异步”:

public async Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)

Microsoft 有更详细的 C# 异步编程指南:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

If I change the return type to async List<HWElDocument'>

您需要 一个 async 修饰符 一个 Task return类型。所以这个签名应该有效:

public async Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)

async 会告诉编译器在内部使用异步状态机,并允许您在方法内部使用 await 关键字。

当你想从异步方法中 return 某些东西时,你将需要一个 Task<T> return 类型。当使用 async 时,编译器也会确保自动将您的 return 值包装在任务中,因此您可以直接 return 值。

因此您的 returning 行应该 使用 await 以便等待来自 ToListAsync 的任务,然后结果将是自动包装在您方法的结果任务中:

public Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)
{
    // Get all Items
    if (ProjectID == null)
        return await database.Table<HWElDocument>().ToListAsync();

    // Or all items meeting a condition
    else
    {
        List<HWDocuProj> projList = await database.Table<HWDocuProj>()
            .Where( item => item.ProjID == ProjectID)
            .ToListAsync();
        return await database.Table<HWElDocument>()
            .Where(item => projList.Exists(p => p.ProjID == item.ID))
            .ToListAsync();
    }
}