Jam*_* Ko 1 .net c# multithreading task async-await
我有两个Task想要按顺序运行的对象.目前,我运行它们的代码如下所示:
private async Task Advance(IToken token, SyntaxKind kind)
{
await Approach(token);
await Surpass(token, kind);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是结合它们的最有效方法吗?我知道async涉及很多状态机逻辑,所以使用它会更有效ContinueWith吗?
private Task Advance(IToken token, SyntaxKind kind)
{
// TODO: This would take advantage of the overload accepting a state
// parameter to avoid the closure allocation
return Approach(token).ContinueWith(() => Surpass(token, kind));
}
Run Code Online (Sandbox Code Playgroud)
如果您认为它更有效,请随意指出另一种方法(既不是await也不是ContinueWith).谢谢.
注意:对于我的情况,我正在寻找结合两个非通用(无结果)Task的最好方法,但是为了谷歌遇到这个问题的人,可以Task<TResult>在你的答案中包括如何结合两个s.
我的问题是,这是结合它们的最有效方法吗?我知道async涉及很多状态机逻辑,所以使用ContinueWith会更有效吗?
状态机逻辑是如此微不足道,以至于在面对任何真正的异步操作(例如,I/O)时都是无关紧要的.确实有一些开销,但这是你为抽象付出的代价.我打赌,除非你在紧密循环中调用这个方法并且大多数操作同步完成,否则开销不会引人注意(甚至可以测量).
如果通过"更高效",你的意思是该方法将运行几纳秒更快(对CPU更有效),然后是的,ContinueWith比一点点效率更高await.
如果"更高效",则意味着代码更易于维护(对人类更有效),那么不是,ContinueWith效率要低得多await.它具有相同的问题StartNew呢.你自己的例子就是这样的例子:它使用当前TaskScheduer而不是线程池1,并且它没有使用最合适的标志.
如果您想深入了解性能方面await,我建议您观看Async的Zen并阅读了解Async和Await的成本.但是,我必须提醒所有读者不要以牺牲可维护代码为代价而陷入微观优化.