这是我的代码,它以异步方式生成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);
...
答案 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);
我们等到完成后再添加到主文档中。