Task returns IsCompleted == true 才真正完成

Task returns IsCompleted == true before it is actually completed

我有两个任务组,我想 运行 在 ASP.NET 申请中一个接一个。

isLogin = false;

Task[] firstBatch = 
{
    new Task(async () => isLogin = await webserviceclient.Login())
};
firstBatch.ForEach(t => t.Start());
Task.WaitAll(firstBatch);



Task[] secondBatch = 
{
    new Task(async () => UsersList1 = isLogin ? await webserviceclient.GetAllUsers(1) : null),
    new Task(async () => UsersList2 = isLogin ? await webserviceclient.GetAllUsers(2) : null)
};
secondBatch.ForEach(t => t.Start());
Task.WaitAll(secondBatch);

webserviceclient.Login() 我有 await _client.GetAsync(_baseUri).ConfigureAwait(false) 呼叫。至于 webserviceclient.GetAllUsers(),我做什么并不重要,因为它从来没有 运行。我想在 await _client.GetAsync(_baseUri) 被调用后 firstBatch[0].IsCompleted 由于未知原因被设置为 true 并且 secondBatch 开始执行。 await _client.GetAsync(_baseUri)Task.WaitAll(secondBatch); 命令后实际停止等待。这显然不是我想要的。

看起来像是某种死锁,但我看不出问题出在哪里。

评论中的答案解决了这个问题。谢谢

isLogin = false;

Task[] firstBatch = 
{
    Task.Run(async () => isLogin = await webserviceclient.Login())
};
Task.WaitAll(firstBatch);



Task[] secondBatch = 
{
    Task.Run(async () => UsersList1 = isLogin ? await webserviceclient.GetAllUsers(1) : null),
    Task.Run(async () => UsersList2 = isLogin ? await webserviceclient.GetAllUsers(2) : null)
};
Task.WaitAll(secondBatch);

至于关于 var loginResults=Task.WhenAll(tasks) 的评论,我同意,但无论如何我从未打算 运行 超过一个 webserviceclient.Login()。由于这只是一个示例,第一组中的任务不同,结果与同一组中的其他任务无关。

我会按如下方式重写您的代码:

var isLogin = false;
isLogin = await webserviceclient.Login();

if(isLogin)
{
    var secondBatch = new []
    {
        webserviceclient.GetAllUsers(1),
        webserviceclient.GetAllUsers(2)
    }; 
    var userResults = await Task.WhenAll(secondBatch);
}