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);
}
我有两个任务组,我想 运行 在 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);
}