我有一个应用程序可以转换一些数据,通常有 1.000 - 30.000 个文件。
我需要做3步:
- 复制文件(替换其中的一些文本)
- 使用 WebClient 发出 Web 请求来下载文件(我将复制的文件发送到 WebServer,WebServer 将文件转换为另一种格式)
- 取出下载的文件并更改一些内容
因此,所有三个步骤都包括一些 I/O,我使用了 async/await 方法:
var tasks = files.Select(async (file) =>
{
Item item = await createtempFile(file).ConfigureAwait(false);
await convert(item).ConfigureAwait(false);
await clean(item).ConfigureAwait(false);
}).ToList();
await Task.WhenAll(tasks).ConfigureAwait(false);
我不知道这是否是最佳实践,因为我创建了数千个任务。我考虑过分成三个步骤,例如:
List<Item> items = new List<Item>();
var tasks = files.Select(async (file) =>
{
Item item = await createtempFile(file, ext).ConfigureAwait(false);
lock(items)
items.Add(item);
}).ToList();
await Task.WhenAll(tasks).ConfigureAwait(false);
var tasks = items.Select(async (item) =>
{
await convert(item, baseAddress, ext).ConfigureAwait(false);
}).ToList();
await Task.WhenAll(tasks).ConfigureAwait(false);
var tasks = items.Select(async (item) =>
{
await clean(targetFile, item.Doctype, ext).ConfigureAwait(false);
}).ToList();
await Task.WhenAll(tasks).ConfigureAwait(false);
但这似乎并没有更好或更快,因为我创建了 3 倍数千个任务。
我应该限制任务的创建吗?喜欢分成 100 个任务吗?
或者我只是想太多了,创建数千个任务就可以了。
CPU 处于空闲状态,峰值为 2-4%,因此我考虑了太多的等待或上下文切换。
也许 WebRequest 调用太多,因为 Web 服务器/Web 服务无法同时处理数千个请求,我应该只限制 Web 请求?
我已经在 app.config 文件中增加了 .NET maxconnection。