【发布时间】:2022-01-06 02:42:13
【问题描述】:
我在我的 Windows 服务 - C# 中有 100 多个要从 Web 下载的大文件。要求是一次维护 - 最多 4 个并行 Web 文件下载。
我可以使用异步等待实现并发/并行下载,还是必须使用BackgroundWorker 进程或线程? async-await 是多线程的吗?
请参阅下面使用 async-await 的示例程序:
static int i = 0;
Timer_tick() {
while (i < 4) {
i++;
model = GetNextModel();
await Download(model);
}
}
private async Download(XYZ model) {
Task<FilesetResult> t = DoWork(model);
result = await t;
//Use Result
}
private async Task<FilesetResult> Work(XYZ model) {
fileresult = await api.Download(model.path)
i--;
return filesetresult;
}
【问题讨论】:
-
是的,但您不必逐个
await下载,而是启动您想要的号码并使用Task.WaitAll,然后再继续下一批。但它不是多线程的。它只是允许 IO 并行发生,但所有 CPU 绑定都将由一个线程处理。如果您也有 CPU 密集型代码,那么您也需要一个并行解决方案。 -
如果IO并行发生但只使用一个线程,使用多个线程会提高性能吗?
-
完全看你除了IO还做了什么。
标签: c# multithreading async-await