【发布时间】:2017-07-14 22:22:17
【问题描述】:
我有两个想要按顺序运行的Task 对象。目前,我运行它们的代码如下所示:
private async Task Advance(IToken token, SyntaxKind kind)
{
await Approach(token);
await Surpass(token, kind);
}
我的问题是,这是组合它们的最有效方式吗?我知道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));
}
如果您认为它会更有效,请随时指出另一种方法(await 或 ContinueWith)。谢谢。
注意: 就我而言,我正在寻找将两个非泛型(无结果)Tasks 结合起来的最佳方式,但对于 Google 遇到这个问题的人来说,没关系包括如何在你的答案中组合两个Task<TResult>s。
【问题讨论】:
-
您的代码已经按顺序运行
Approach和Surpass。你所拥有的有什么问题?你是什么意思“结合他们”? -
您已经以两种方式编写了代码。您对“效率”的含义有了一些想法。所以:双向运行代码,双向衡量它的效率,然后你就会知道哪个“更有效”。使用科学;做一些测量。如果您不知道如何衡量“效率”,那么谁在乎哪个更有效?你说不出来。
-
如果你关心优化而不关心保存线程之间的上下文,为什么不使用 await "await Approach(token).ConfigureAwait(false); await Surpass(token, kind).ConfigureAwait(错误的);” ?
标签: c# .net multithreading async-await task