diff --git a/BillDemo/BillDemo.csproj b/BillDemo/BillDemo.csproj new file mode 100644 index 0000000..21dff5c --- /dev/null +++ b/BillDemo/BillDemo.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp2.2 + + + diff --git a/BillDemo/Program.cs b/BillDemo/Program.cs new file mode 100644 index 0000000..415ef76 --- /dev/null +++ b/BillDemo/Program.cs @@ -0,0 +1,9 @@ +using System; + +namespace BillDemo { + class Program { + static void Main(string[] args) { + Console.WriteLine("Hello World!"); + } + } +} diff --git a/BillDemo/TaskRunner.cs b/BillDemo/TaskRunner.cs new file mode 100644 index 0000000..1d8ff21 --- /dev/null +++ b/BillDemo/TaskRunner.cs @@ -0,0 +1,17 @@ +using ParallelProcessPractice.Core; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace BillDemo { + class TaskRunner : TaskRunnerBase { + public override void Run(IEnumerable tasks) { + Parallel.ForEach(tasks, new ParallelOptions { MaxDegreeOfParallelism = 11 }, task => { + task.DoStepN(1); + task.DoStepN(2); + task.DoStepN(3); + }); + } + } +} diff --git a/BillDemo/TaskRunnerV1.cs b/BillDemo/TaskRunnerV1.cs new file mode 100644 index 0000000..9a27006 --- /dev/null +++ b/BillDemo/TaskRunnerV1.cs @@ -0,0 +1,53 @@ +using ParallelProcessPractice.Core; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Channels; +using System.Threading.Tasks; + +namespace BillDemo { + class TaskRunnerV1 : TaskRunnerBase { + public override void Run(IEnumerable tasks) { + + Task t0 = Task.Run(async () => { foreach (var task in tasks) { await queues[1].Writer.WriteAsync(task); } queues[1].Writer.Complete(); }); + Task t1 = DoAllStepNAsync(1); + Task t2 = DoAllStepNAsync(2); + Task t3 = DoAllStepNAsync(3); + + //Task.WaitAll(tasks.Select(t => Task.Run(async () => + //{ + // await this.queues[1].Writer.WriteAsync(t); + //})).ToArray()); + + //queues[1].Writer.Complete(); + + Task.WaitAll(t1, t2, t3); + } + + private Channel[] queues = new Channel[3 + 1] + { + null, + Channel.CreateBounded(5), + Channel.CreateUnbounded(), + Channel.CreateUnbounded(), + }; + + private async Task DoAllStepNAsync(int step) { + bool last = (step == 3); + List ts = new List(); + while (await queues[step].Reader.WaitToReadAsync()) { + while (queues[step].Reader.TryRead(out MyTask task)) { + ts.Add(Task.Run(async () => + { + task.DoStepN(step); + if (!last) + await queues[step + 1].Writer.WriteAsync(task); + })); + } + } + Task.WaitAll(ts.ToArray()); + if (!last) + queues[step + 1].Writer.Complete(); + } + } +} diff --git a/ParallelProcessPractice.sln b/ParallelProcessPractice.sln index 387a9fb..611913d 100644 --- a/ParallelProcessPractice.sln +++ b/ParallelProcessPractice.sln @@ -47,6 +47,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NathanDemo", "NathanDemo\Na EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JolinDemo", "JolinDemo\JolinDemo.csproj", "{C58EA4C0-FFEC-43D6-97ED-EF755AE14B64}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BillDemo", "BillDemo\BillDemo.csproj", "{F080C41B-CBFA-49C8-844F-DA612F43651B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -117,6 +119,10 @@ Global {C58EA4C0-FFEC-43D6-97ED-EF755AE14B64}.Debug|Any CPU.Build.0 = Debug|Any CPU {C58EA4C0-FFEC-43D6-97ED-EF755AE14B64}.Release|Any CPU.ActiveCfg = Release|Any CPU {C58EA4C0-FFEC-43D6-97ED-EF755AE14B64}.Release|Any CPU.Build.0 = Release|Any CPU + {F080C41B-CBFA-49C8-844F-DA612F43651B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F080C41B-CBFA-49C8-844F-DA612F43651B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F080C41B-CBFA-49C8-844F-DA612F43651B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F080C41B-CBFA-49C8-844F-DA612F43651B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -136,6 +142,7 @@ Global {1B34613F-9384-4365-A54E-D9719D6E902B} = {B21D6D24-8EC2-497F-AE16-E0155FEE28CE} {CD021A28-2C35-4FAA-BFDC-3E4543F009A0} = {B21D6D24-8EC2-497F-AE16-E0155FEE28CE} {C58EA4C0-FFEC-43D6-97ED-EF755AE14B64} = {B21D6D24-8EC2-497F-AE16-E0155FEE28CE} + {F080C41B-CBFA-49C8-844F-DA612F43651B} = {B21D6D24-8EC2-497F-AE16-E0155FEE28CE} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {15051360-3A56-4052-A944-97C62F90EEC6}