用于启动任务并获取其返回值的更好模式

阿佩龙

我正在执行一些异步工作,无奈,但最终感觉自己是一个非常丑陋的结构,我想知道是否以及如何将其重写为“感觉更好”的东西。

 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;

为了简洁起见,已更改了变量名,实际上还有很多任务。任务都可以独立运行,但是所有任务都必须完成才能继续。

DoSomeStuff 看起来像这样:

private Guid DoSomeStuff<T>(DependentTransaction dtx, T thing, Func<T, Guid> method)
i3arnon

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在方法外定义变量并获取其返回值

来自分类Dev

Celery在重新启动之前未记录返回值或获取新任务

来自分类Dev

从任务返回值

来自分类Dev

任务返回值,不带Task <T>(异步/等待模式)

来自分类Dev

任务返回值,不带Task <T>(异步/等待模式)

来自分类Dev

使用返回值启动未知数量的并行任务

来自分类Dev

在Scala中,返回值本身用于默认模式匹配

来自分类Dev

从结构任务返回值

来自分类Dev

是否可以查询Python模拟对象以获取其调用的返回值?

来自分类Dev

是否可以查询Python模拟对象以获取其调用的返回值?

来自分类Dev

如何在PyQt5中获取其他widget的mousePressEvent的返回值

来自分类Dev

简单赋值帮助:调用函数向其传递参数并获取其返回值

来自分类Dev

Java调试模式:如何获取函数调用的返回值

来自分类Dev

获取php返回值并将其用于if语句

来自分类Dev

错误的返回值模式

来自分类Dev

启动服务并返回值

来自分类Dev

处理异常或返回值的更好方法

来自分类Dev

处理异常或返回值的更好方法

来自分类Dev

Gulp-从另一个任务获取一个任务的返回值

来自分类Dev

Gulp-从另一个任务获取一个任务的返回值

来自分类Dev

如何将代码块存储在变量中,并在需要时调用它并获取其返回值?

来自分类Dev

获取函数返回值

来自分类常见问题

从setTimeout获取返回值

来自分类Dev

从CFMODULE获取返回值

来自分类Dev

获取最后的返回值

来自分类Dev

获取线程的返回值

来自分类Dev

获取命令的返回值

来自分类Dev

如何获得任务的结果或返回值?

来自分类Dev

返回值比返回局部变量更好吗?