在异步IO API调用之后,在异步方法中的多个并发线程上继续



如果我有这个

static void Main(string[] args)
{
var tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
tasks.Add(AsyncWithBlockingIO(i));
}
Task.WaitAll(tasks.ToArray());
}
private static async Task AsyncWithBlockingIO(int fileNum)
{
var result = await File.ReadAllTextAsync($"File{fileNum}").ConfigureAwait(false);
//will the below run concurrently on multiple threads?
CpuNoIOWork(result);
}

当IO调用完成时,CpuNoIOWork()会在多个线程上同时运行(使用线程池(吗?还是一次只使用一个线程?

当IO调用完成时,CpuNoIOWork((会在多个线程上同时运行(使用线程池(,还是一次只使用一个线程?

它将在线程池线程上并发运行。

然而,根据await的内部结构,它可能会在I/O线程池线程上继续,这是不可取的。如果您有CPU绑定的工作,我建议将其封装在Task.Run中,这将确保工作将在工作线程池线程上运行:

var result = await File.ReadAllTextAsync($"File{fileNum}").ConfigureAwait(false);
await Task.Run(() => CpuNoIOWork(result));