最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

环球最新:并行执行异步方法的最佳实践

来源:博客园


(资料图片)

前言

最近写了三篇关于并行异步的博客,因为我走了很多弯路。

并行执行异步方法并接收返回值这个问题,stackoverflow上讨论好几年,.NET 6实现了Parallel.ForeachAsync。https://stackoverflow.com/questions/15136542/parallel-foreach-with-asynchronous-lambda

.NET 6 中的 API Parallel.ForEachAsync 在官方的博客中一直被忽略,但是我觉得这个 API 非常的实用!(这句话参考了博客:https://blog.csdn.net/sD7O95O/article/details/117914853)

要求

  1. 必须接收处理返回值

示例1

示例2

代码说明

  1. 这种代码,java是无法优雅地写出来的,会很难阅读和维护。java19也许可以。
  2. 使用场景:普通的增删改查功能估计是用不到,但我用到了。
  3. 上述代码的并行度,可以根据es集群的性能和吞吐量以及具体需求,进行合理的调整。

可以复制的代码

上述代码是图片不方便复制,可以复制的代码在 探索:优雅地实现异步方法的并行执行 文章的最后。

简单的示例Demo代码

private async void button4_Click(object sender, EventArgs e){    await Task.Run(async () =>    {        Log($"==== 并行异步 开始,线程ID={Thread.CurrentThread.ManagedThreadId} ========================");        Stopwatch sw = Stopwatch.StartNew();        HttpClient httpClient = HttpClientFactory.GetClient();        var tasks = new Dictionary>>();        ConcurrentQueue strs = new ConcurrentQueue();        await Parallel.ForEachAsync(Enumerable.Range(0, m), new ParallelOptions() { MaxDegreeOfParallelism = 100 }, async (i, c) =>        {            int sum = 0;            await Parallel.ForEachAsync(Enumerable.Range(0, n), new ParallelOptions() { MaxDegreeOfParallelism = 30 }, async (j, c) =>            {                Dictionary dict = await RequestAsync(_url, i);                if (dict.ContainsKey(j))                {                    int num = dict[j];                    Interlocked.Exchange(ref sum, sum + num);                    strs.Enqueue($"{num}");                }            });            Log($"输出:sum={sum}");        });        Log($"输出:{string.Join(",", strs.ToArray())}");        sw.Stop();        Log($"==== 结束,线程ID={Thread.CurrentThread.ManagedThreadId},耗时:{sw.Elapsed.TotalSeconds:0.000}秒 ========================");    });}

上述代码说明

代码中 Parallel.ForEachAsync(Enumerable.Range(0, m),... 代替了for循环。

关键词: 并行执行 异步方法 可以复制