任务.WhenAll存在问题,如何找出每个任务是否已完成?

3
如果要确认TasksList中的所有任务都已成功完成,我只想将AllMethodsCompleted设置为true。但是,当我想找出是否所有任务都已成功完成时,我遇到了错误消息。 我做错了什么?

错误 CS0029:无法将类型“void”隐式转换为“System.Threading.Tasks.Task”

public async Task PlayerAccountDetails()
{
    var playerCountryData = GetPlayerCountryData();
    var playerTagsData = GetPlayerTagsData();
    var TasksList = new List<Task> { playerCountryData, playerTagsData };

    Task t = await Task.WhenAll(TasksList);
    if (t.Status == TaskStatus.RanToCompletion)
        AllMethodsCompleted = true;
    else
        AllMethodsCompleted = false;
}

1
GetPlayerCountryData()GetPlayerTagsData()的返回类型是什么? - Nate Barbettini
你是想要检查任务是否成功完成且没有出现任何错误或异常吗?还是只是想等待任务完成? - Rahul
我想等待任务完成,我需要知道所有任务是否成功且没有任何错误或异常。@NateBarbettini它们是私有的async Task GetPlayerCountryData和私有的async Task GetPlayerTagsData()。 - Tobey60
2个回答

3

Task.WhenAll会返回一个任务,您可以等待所有任务完成后再进行操作,所以您只需要这样写:

public async Task PlayerAccountDetails()
{
    var playerCountryData = GetPlayerCountryData();
    var playerTagsData = GetPlayerTagsData();
    var TasksList = new List<Task> { playerCountryData, playerTagsData };

    await Task.WhenAll(TasksList);
    AllMethodsCompleted = true;
}

如果任何一个任务被取消或抛出异常,那么这行代码:await Task.WhenAll(TasksList) 将会抛出一个异常。

如果您想处理其中一个任务的失败,可以这样做:

try
{
    await Task.WhenAll(TasksList);
    AllMethodsCompleted = true;
}
catch
{
    AllMethodsCompleted = false;
}

我需要为 await Task.WhenAll(TasksList) 创建一个 try-catch 块吗?就像这样:try{ await Task.WhenAll(TasksList);} catch{ AllMethodsCompleted = false;} - Tobey60
@Tobey60,你可以这样做,但是由PlayerAccountDetails返回的Task将在Task.WhenAll完成后完成,因此最好将其推迟到PlayerAccountDetails的调用者。 - Johnathan Barclay
@Tobey60 - 我已更新答案,展示了如何处理您正在等待的任务中的错误。 - Sean

2

Task.WhenAll(IEnumerable<Task>)返回Task

通过等待(非泛型)Task,您不会得到返回值,因此Task t = await Task.WhenAll(TasksList);无法编译。你只需要:

await Task.WhenAll(TasksList);

您也可以这样写:
Task t = Task.WhenAll(TasksList);
await t;

1
你的回答与已发布的回答有何不同? - Rahul
1
@Rahul 因为发布的内容并没有解释编译错误,这似乎是误解的关键点。 - Johnathan Barclay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接