调用许多异步任务并按特定顺序处理结果

时间:2014-12-01 15:15:12

标签: c# .net asynchronous

这是我的代码,它以异步方式生成XmlNodes,然后将这些节点插入主文档 - 顺序,因为它是快速的过程,我也可能需要保持一定的顺序。

要导入大约15个节点。如何重构此代码以使代码更紧凑?

XmlNode soccerNode = null;
XmlNode basketbalNode = null;
XmlNode hockeyNode = null;
...

var tasks = new List<Task>
            {
                Task.Factory.StartNew(() => soccerNode = this.getSoccer()),
                Task.Factory.StartNew(() => basketbalNode = this.getBasketball()),
                Task.Factory.StartNew(() => hockeyNode = this.getHockey()),
...};
Task.WaitAll(tasks.ToArray());

AddToMainDocument(soccerNode);
AddToMainDocument(basketbalNode);
AddToMainDocument(hockeyNode);
...

2 个答案:

答案 0 :(得分:2)

我猜猜getSoccer,getBasketball和getHockey是属性,因为你的代码示例没有任何方法括号?如果它们是方法,那么只需将缺少的括号添加到下面的代码中。

var soccerTask = Task.Run(() => getSoccer).ConfigureAwait(false);
var basketbalTask = Task.Run(() => getBasketball).ConfigureAwait(false);
var hockeyTask = Task.Run(() => getHockey).ConfigureAwait(false);

AddToMainDocument(await soccerTask);
AddToMainDocument(await basketbalTask);
AddToMainDocument(await hockeyTask);

所有三个作业都是异步执行的,然后按照您需要的顺序等待它们。

关于如何使代码更紧凑,我需要了解更多。方法/属性是否都在同一个对象中?他们都应该被召唤吗?您可以使用反射来查找所有方法,在其上具有属性以指定顺序,并使用该信息来旋转任务并以正确的顺序等待它们。

但说实话,如果您知道需要调用哪些方法,那么就像在您的示例中一样手动执行。如果你有一个动态对象,其中添加/删除方法,那么你应该使用反射来完成工作,否则它只是一个不必要的开销。

答案 1 :(得分:0)

认为这可能会有所帮助:

var t1 = Task.Factory.StartNew(() => soccerNode = /*Do something */);
var t2 = Task.Factory.StartNew(() => basketbalNode = /*Do something */);
var tasks = new List<Task> { t1, t2 };

Task.WaitAll(tasks.ToArray());

AddToMainDocument(t1.Result);
AddToMainDocument(t2.Result);

我们等到完成后再添加到主文档中。