Ape*_*ron 3 .net c# task-parallel-library
我正在实现一些异步工作并且无法帮助,但我觉得我最终会得到一个非常难看的构造,我想知道是否以及如何将其重写为"感觉更好"的东西.
var tasks = new List<Task>();
var t1 = new Task<Guid>(() => DoSomeStuff<Xyz>(dtx, e1, M1));
var t2 = new Task<Guid>(() => DoSomeStuff<Qrs>(dtx, e2, M2));
var t3 = new Task<Guid>(() => DoSomeStuff<Abc>(dtx, e3, M3));
tasks.Add(t1);
tasks.Add(t2);
tasks.Add(t3);
tasks.ForEach(x => x.Start());
Task.WaitAll(tasks.ToArray<Task>());
returnDto.t1value = t1.Result;
returnDto.t2value = t2.Result;
returnDto.t3value = t3.Result;
Run Code Online (Sandbox Code Playgroud)
为简洁起见,变量名称已被更改,实际上还有更多任务.任务都可以独立运行,但所有任务都必须在我们继续之前完成.
DoSomeStuff 看起来像这样:
private Guid DoSomeStuff<T>(DependentTransaction dtx, T thing, Func<T, Guid> method)
Run Code Online (Sandbox Code Playgroud)
使用async-await异步等待,Task.WhenAll等待多个任务并获得结果并且并行Task.Run运行会更容易DoSomeStuff:
Guid[] results = await Task.WhenAll(
Task.Run(() => DoSomeStuff<Xyz>(dtx, e1, M1)),
Task.Run(() => DoSomeStuff<Qrs>(dtx, e2, M2)),
Task.Run(() => DoSomeStuff<Abc>(dtx, e3, M3)));
Run Code Online (Sandbox Code Playgroud)