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

axk*_*axk 0 .net c# multithreading async-await

如果我有这个

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);
}
Run Code Online (Sandbox Code Playgroud)

CpuNoIOWork()同时运行多个线程(使用线程池)作为IO调用完成还是会只使用1个线程在同一时间?

Ste*_*ary 7

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

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

但是,根据您正在执行的内容的内部结构await,它可能会在 I/O 线程池线程上继续运行,这是不可取的。如果您有 CPU 密集型工作,我建议将其包装在 中Task.Run,这将确保工作将在工作线程池线程上运行:

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