{"id":4022,"date":"2020-09-08T14:50:42","date_gmt":"2020-09-08T13:50:42","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=4022"},"modified":"2022-12-22T11:51:50","modified_gmt":"2022-12-22T10:51:50","slug":"c-task-runparallel","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/c-task-runparallel\/","title":{"rendered":"C# Task RunParallel"},"content":{"rendered":"\n<p>Update 2022-12-22:<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">\npublic static async Task&lt;IEnumerable&lt;T>> RunParallel&lt;T>(int concurrency, IEnumerable&lt;Func&lt;Task&lt;T>>> actions)\n{\n    using (var semaphore = new SemaphoreSlim(concurrency))\n    {\n        var tasks = new List&lt;Task&lt;T>>();\n        foreach (var action in actions)\n        {\n            await semaphore.WaitAsync();\n            var t = Task.Run(async () =>\n            {\n                try\n                {\n                    return await action();\n                }\n                finally\n                {\n                    semaphore.Release();\n                }\n            });\n            tasks.Add(t);\n        }\n        return await Task.WhenAll(tasks);\n    }\n}\n\n\/\/ example use:\nvar tasks = new List&lt;Func&lt;Task&lt;bool>>>();\nforeach (var myTask in myTasks)\n{\n    tasks.Add(() => myTask(\"A\", \"B\"));\n}\nvar results = await RunParallel(3, tasks);<\/pre><\/div>\n\n\n\n<p>Original:<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nclass Program\n{\n    public static async Task RunParallel&lt;T>(int concurrency, IEnumerable&lt;T> args, Func&lt;T, Task> action)\n    {\n        using (var semaphore = new SemaphoreSlim(concurrency))\n        {\n            var tasks = new List&lt;Task>();\n            foreach (var arg in args)\n            {\n                await semaphore.WaitAsync();\n\n                var t = Task.Run(async () =>\n                {\n                    try\n                    {\n                        await action(arg);\n                    }\n                    finally\n                    {\n                        semaphore.Release();\n                    }\n                });\n\n                tasks.Add(t);\n            }\n            await Task.WhenAll(tasks);\n        }\n    }\n\n    static async Task Main(string[] args)\n    {\n\n        var arguments = Enumerable.Range(1, 15).Select(e => e.ToString()).ToList();\n        await RunParallel(3, arguments, async (a) =>\n        {\n            Console.WriteLine(\"Start: \" + a);\n            await Task.Delay(2000);\n            Console.WriteLine(\"End: \" + a);\n        });\n\n        Console.WriteLine(\"Finished!\");\n    }\n}<\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Update 2022-12-22: Original:<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[6,4,1],"tags":[],"class_list":["post-4022","post","type-post","status-publish","format-standard","hentry","category-dotnet","category-programming","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4022","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=4022"}],"version-history":[{"count":3,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4022\/revisions"}],"predecessor-version":[{"id":7151,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4022\/revisions\/7151"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=4022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=4022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=4022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}