Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';将两项任务结合起来最有效的方法是什么?_C#_.net_Multithreading_Async Await_Task - Fatal编程技术网

C# 什么';将两项任务结合起来最有效的方法是什么?

C# 什么';将两项任务结合起来最有效的方法是什么?,c#,.net,multithreading,async-await,task,C#,.net,Multithreading,Async Await,Task,我有两个Task对象要按顺序运行。目前,我运行它们的代码如下所示: private async Task Advance(IToken token, SyntaxKind kind) { await Approach(token); await Surpass(token, kind); } 我的问题是,这是将它们结合在一起最有效的方法吗?我知道async涉及很多状态机逻辑,所以使用ContinueWith会更有效吗 private Task Advance(IToken to

我有两个
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));
}
如果您认为另一种方法更有效,请随时指出它(既不是
等待
也不是
继续
)。多谢各位


注意:就我而言,我正在寻找将两个非通用(无结果)的
任务组合在一起的最佳方法,但是为了谷歌遇到这个问题的人,在你的答案中也可以包括如何将两个
任务组合在一起。

优化执行的方法是指定。这将导致在导致先行任务转换为最终状态的同一线程上同步执行延续。因此,您可以避免将延续排队到任务调度器并由工作线程检索它所带来的开销

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), TaskContinuationOptions.ExecuteSynchronously);
}

如果您想知道为什么默认情况下不执行此操作,请参见

优化执行的方法是指定。这将导致在导致先行任务转换为最终状态的同一线程上同步执行延续。因此,您可以避免将延续排队到任务调度器并由工作线程检索它所带来的开销

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), TaskContinuationOptions.ExecuteSynchronously);
}
如果您想知道为什么默认情况下不这样做,请参阅

我的问题是,这是将它们结合在一起最有效的方法吗?我知道异步涉及很多状态机逻辑,所以使用ContinueWith会更有效吗

状态机逻辑非常简单,以至于在任何真正的异步操作(例如,I/O)面前都无关紧要。确实存在一些开销,但这是您为抽象所付出的代价。我敢打赌,除非您在一个紧密的循环中调用这个方法,并且大多数操作都是同步完成的,否则开销将不会明显(甚至是可测量的)

如果“效率更高”,您的意思是该方法将运行几纳秒(CPU效率更高),那么是的,
ContinueWith
wait
的效率稍微高一点

如果“更高效”,您的意思是代码更易于维护(对人类来说更高效),那么不是。它有一个最大的优点。您自己的示例就是一个例子:它使用当前的
TaskScheduer
而不是线程池,并且没有使用最合适的标志

如果您想深入了解
wait
的性能方面,我建议您观看和阅读。然而,我必须提醒所有读者不要以牺牲可维护代码为代价而陷入微观优化

我的问题是,这是将它们结合在一起最有效的方法吗?我知道异步涉及很多状态机逻辑,所以使用ContinueWith会更有效吗

状态机逻辑非常简单,以至于在任何真正的异步操作(例如,I/O)面前都无关紧要。确实存在一些开销,但这是您为抽象所付出的代价。我敢打赌,除非您在一个紧密的循环中调用这个方法,并且大多数操作都是同步完成的,否则开销将不会明显(甚至是可测量的)

如果“效率更高”,您的意思是该方法将运行几纳秒(CPU效率更高),那么是的,
ContinueWith
wait
的效率稍微高一点

如果“更高效”,您的意思是代码更易于维护(对人类来说更高效),那么不是。它有一个最大的优点。您自己的示例就是一个例子:它使用当前的
TaskScheduer
而不是线程池,并且没有使用最合适的标志


如果您想深入了解
wait
的性能方面,我建议您观看和阅读。但是,我必须提醒所有读者,不要以牺牲可维护代码为代价进行微优化。

您的代码已经按顺序运行了
方法
超越
。你的东西怎么了?“组合它们”是什么意思?代码是双向编写的。你对“效率”的含义有些概念。因此:双向运行代码,双向测量其效率,然后您将知道哪一个“更有效”。运用科学;做一些测量。如果你不知道如何衡量“效率”,那么谁会在乎哪个更有效呢?你不知道。如果你关心优化而不关心在线程之间保存上下文,为什么不使用wait“wait方法(令牌)。configurewait(false);wait-superse(令牌,种类)。configurewait(false);”?你的代码已经按顺序运行了
方法
超越
。你的东西怎么了?“组合它们”是什么意思?代码是双向编写的。你对“效率”的含义有些概念。因此:双向运行代码,双向测量其效率,然后您将知道哪一个“更有效”。运用科学;做一些测量。如果你不知道如何衡量“效率”,那么谁会在乎哪个更有效呢?你说不出来。如果你关心优化而不关心在线程之间保存上下文,为什么不使用wait“wait方法(令牌)。configurewait(false);wait superson(令牌,种类)。configurewait(false);”?执行同步并不保证任何事情。这只是对调度程序的一个请求。@TanveerBadar:…在绝大多数情况下,这是值得尊重的。ExecuteSynchronously不能保证任何事情。这只是对调度程序的一个请求。@TanveerBadar:…这在v中得到了尊重