这篇文章不讲“语法”,讲的是线上更稳的 async/await 使用习惯。
.Result / .Wait() 阻塞等待阻塞等待会把“异步”硬拉回同步世界:
正确姿势:一路 async 到底。
var data = await client.GetStringAsync(url);
Task.RunTask.Run 适合把 CPU 密集型 工作丢到线程池;
但如果你本来就是 I/O 异步(HTTP/DB/文件),再包一层 Task.Run 只会:
CancellationToken取消是 .NET 里“优雅停机”和“及时释放资源”的基础能力。
CancellationToken 就要传下去public async Task<string> FetchAsync(HttpClient http, string url, CancellationToken ct)
=> await http.GetStringAsync(url, ct);
_ = SomeAsync(); 这种写法如果没有可靠的异常处理/日志,失败会变成“沉默失败”。
如果你确实需要后台执行:
BackgroundService / 队列foreach + awaitTask.WhenAllSemaphoreSlim / Channelvar tasks = urls.Select(u => http.GetStringAsync(u, ct));
var pages = await Task.WhenAll(tasks);