可以在 .NET 应用程序中等待 1000 个任务的集合吗?还是应该使用批处理?

Pur*_*ome 5 .net c# azure async-await

我有一个简单的控制台应用程序测试一些代码。

我的代码有一个包含 1000 个数字的列表,并将每个数字/整数放入 Azure 队列。

现在,我异步执行此操作,并且效果很好。这是我库中的代码:

var tasks = stagedFileIds.Select(stagedFileId => QueueFileToProcessAsync(stagedFileId));
await Task.WhenAll(tasks)
          .ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

效果很好。

但是..这是一件坏事吗?我应该把它分成 50 个或 25 个吗?但最重要的是......批量吗?

执行上述代码的“成本”是多少?

请记住,现在这是一个控制台应用程序。我将在某个时候将其移至 Azure 函数。

Ger*_*ino 1

如果您的操作是 IO 阻塞的,这意味着它们等待某些资源,无论是访问文件、返回 Web 请求等,那么这是一个不错的解决方案(尽管要警惕异常)。是否应该批处理它取决于资源。如果所有任务都想写入同一个文件,那么异步它根本没有意义。如果所有任务都写入同一个驱动器 - 好吧,可能没问题。如果您调用外部网络服务器,这取决于它可以处理多少个请求(并阅读有关内容System.Net.ServicePointManager.DefaultConnectionLimit

如果您的操作是 CPU 阻塞的,这意味着它们需要在本地计算机上执行一些繁重的计算和数据处理,那么更好的方法是使用Parallel.ForEach. 这将自动获取一个集合并将工作分配给特定数量的线程(您可以使用DegreesOfParallelism选项指定)。如果您有 4 个 HT 核心,即 8 个逻辑线程,您可以将 DOP 设置为 8,并且所有 CPU 将充分利用以尽快完成处理。当所有项目完成(或者您使用 取消它CancellationToken)时,该方法将返回。