-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOrchestrator.cs
More file actions
57 lines (47 loc) · 1.69 KB
/
Orchestrator.cs
File metadata and controls
57 lines (47 loc) · 1.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// <auto-generated/>
#nullable restore
using System.Collections.Generic;
using System.Threading.Tasks;
namespace TestLibrary;
internal class Orchestrator : IOrchestrator
{
private readonly TestLibrary.A a;
private readonly TestLibrary.B b;
private readonly TestLibrary.C c;
private readonly TestLibrary.D d;
private readonly TestLibrary.E e;
private readonly TestLibrary.F f;
public Orchestrator(TestLibrary.A a, TestLibrary.B b, TestLibrary.C c, TestLibrary.D d, TestLibrary.E e, TestLibrary.F f)
{
this.a = a;
this.b = b;
this.c = c;
this.d = d;
this.e = e;
this.f = f;
}
public async Task<int> Execute()
{
var resultATask = a.CallA();
var resultBTask = b.CallB();
var resultCTask = new System.Threading.Tasks.Task<int>(() => default);
var resultDTask = d.CallD();
var resultETask = new System.Threading.Tasks.Task<int>(() => default);
var tasksToProcess = new List<Task> { resultATask, resultBTask, resultDTask };
await foreach (var completed in Task.WhenEach(tasksToProcess))
{
if (!resultCTask.IsCompleted && resultATask.IsCompleted && resultBTask.IsCompleted)
{
resultCTask = c.CallC(resultATask.Result, resultBTask.Result);
tasksToProcess.Add(resultCTask);
}
if (!resultETask.IsCompleted && resultDTask.IsCompleted)
{
resultETask = e.CallE(resultDTask.Result);
tasksToProcess.Add(resultETask);
}
}
var finalResult = await f.CallF(resultCTask.Result, resultETask.Result);
return finalResult;
}
}