我不知道它是否更漂亮,但你可以考虑这样做:
await Parallel.ForEachAsync(
source: numbers,
parallelOptions: new ParallelOptions { MaxDegreeOfParallelism = 2 },
body: ToValueTaskResult<int>(WorkAsync));
static Func<T, CancellationToken, ValueTask> ToValueTaskResult<T>(
Func<T, CancellationToken, Task> function)
=> async (item, ct) => await function(item, ct).ConfigureAwait(false);
老实说,我认为
Parallel.ForEachAsync
API如果接受
Func<T, CancellationToken, Task>
委派为
body
,因为此API最常见的使用场景是网络上的高延迟I/O绑定操作。对于这些场景,从
Task
到
ValueTask
在性能或内存效率方面几乎没有差异。降低API的一般可用性,以优化一些具有
IValueTaskSource
-支持
身体
代表们,对我来说没有什么意义。但这就是我们现在拥有的,而且肯定比
what we had earlier
,所以我没有太多抱怨。