启动任务和获取返回值的更好模式

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)

i3a*_*non 5

使用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)