c# - 使用 C# 并行执行任务。我这样做对吗?
问题描述
我已经搜索并阅读过,我只是想确定我是否正确。我要并行运行三种方法,并且我想确保在继续之前完成所有方法。它们都是异步的,并且此代码位于异步方法中。我已经这样做了:
public async ProcessBegin() {
//... some code
await SomeProcess();
await AnotherMethod().
}
public async SomeProcess() {
//.. some code
var tasks = new Task[3];
tasks[0] = method1();
tasks[1] = method2();
tasks[2] = method3();
Task.WaitAll(tasks);
}
public async Method1(){...}
public async Method2(){...}
public async Method3(){...}
这是正确的吗?
解决方案
Task.WaitAll
同步阻塞,因此Parallel.Invoke
如果您打算这样做,您可以使用:
Parallel.Invoke(() => method1(), () => method2(), () => method3());
只要methodX
方法本身不是异步的,这就会起作用。Parallel.ForEach 不适用于异步操作。
如果你想等待任务异步完成,你应该使用Task.WhenAll
:
var tasks = new Task[3];
tasks[0] = method1();
tasks[1] = method2();
tasks[2] = method3();
await Task.WhenAll(tasks);
推荐阅读
- serial-port - 未来科技设备国际交流
- openscript - 带有 OpenScript 的 JsonExtractor
- python - Python:lamda 与 if/else
- c++ - 没有#pragma comment lib 命令的未解决的外部符号错误
- sequelize.js - 在 Sequelize where 函数中指定模型名称
- php - 204 错误 - Hubspot 表单错误
- django - Django 模型继承 - 多表继承
- css - CSS - 几秒钟后使鼠标指针消失
- python-2.7 - 如何在 python 2.7 中定义浮点矩阵
- authentication - 是否可以在两个 cakephp 站点之间集成单点登录