Task.WhenAll 没有恢复
Task.WhenAll doesn't resume
下面的代码是我正在尝试做的简化版本。该代码应该很快到达 Console.ReadKey() 行,但它从未发生过。 Task.WhenAll 从不恢复下一行。代码有什么问题?
class Program
{
static void Main(string[] args)
{
DoWorkAsync().Wait();
Console.ReadKey();
}
static async Task DoWorkAsync()
{
var block = new ActionBlock<Job>(async (task) =>
{
await task.DoAsync();
});
var jobs = Enumerable.Range(0, 2).Select(i => new Job());
foreach (var job in jobs)
{
await block.SendAsync(job);
}
await Task.WhenAll(jobs.Select(c => c.Completion));
}
public class Job
{
TaskCompletionSource<bool> completionSource = new TaskCompletionSource<bool>();
public Task<bool> Completion { get { return completionSource.Task; } }
public async Task DoAsync()
{
await Task.Delay(100);
completionSource.SetResult(true);
}
}
会有帮助。
var jobs = Enumerable.Range(0, 2).Select(i => new Job()).ToList();
这是因为 jobs
的多重枚举
在这一行中 await Task.WhenAll(jobs.Select(c => c.Completion));
您正在等待新的作业,这些作业不会发送到块。
下面的代码是我正在尝试做的简化版本。该代码应该很快到达 Console.ReadKey() 行,但它从未发生过。 Task.WhenAll 从不恢复下一行。代码有什么问题?
class Program
{
static void Main(string[] args)
{
DoWorkAsync().Wait();
Console.ReadKey();
}
static async Task DoWorkAsync()
{
var block = new ActionBlock<Job>(async (task) =>
{
await task.DoAsync();
});
var jobs = Enumerable.Range(0, 2).Select(i => new Job());
foreach (var job in jobs)
{
await block.SendAsync(job);
}
await Task.WhenAll(jobs.Select(c => c.Completion));
}
public class Job
{
TaskCompletionSource<bool> completionSource = new TaskCompletionSource<bool>();
public Task<bool> Completion { get { return completionSource.Task; } }
public async Task DoAsync()
{
await Task.Delay(100);
completionSource.SetResult(true);
}
}
会有帮助。
var jobs = Enumerable.Range(0, 2).Select(i => new Job()).ToList();
这是因为 jobs
在这一行中 await Task.WhenAll(jobs.Select(c => c.Completion));
您正在等待新的作业,这些作业不会发送到块。