gpt4 book ai didi

c# - 合并两个任务的最有效方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 17:48:41 25 4
gpt4 key购买 nike

我有两个 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)。谢谢。

注意:对于我的情况,我正在寻找结合两个非通用(无结果)Task 的最佳方法s,但是为了那些通过谷歌遇到这个问题的人,可以包括如何将两个 Task<TResult> 结合起来。也在你的回答中。

最佳答案

My question is, is this the most efficient way to combine them? I am aware that async involves a lot of state machine logic, so would it be more efficient to use ContinueWith?

状态机逻辑是如此微不足道,以至于面对任何真正的异步操作(例如,I/O)都无关紧要。确实有一些开销,但这是您为抽象付出的代价。我敢打赌,除非您在紧密循环中调用此方法并且大部分操作同步完成,否则开销不会引人注意(甚至无法测量)。

如果说“更高效”,你的意思是该方法将运行快几纳秒(对 CPU 更有效),那么是的,ContinueWithawait 更高效一点点

如果“更高效”是指代码更易于维护(对人类更高效),那么不,ContinueWith is much less efficient than await。它有 same problems that StartNew does 。您自己的示例就是对此的说明:它使用当前的 TaskScheduer 而不是线程池,并且没有使用最合适的标志。

如果您想更深入地了解 await 的性能方面,我建议您观看 Zen of Async 并阅读 Understanding the Costs of Async and Await 。但是,我必须提醒所有读者不要陷入以可维护代码为代价的微优化。

关于c# - 合并两个任务的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45112382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com