【问题标题】:What are examples of dependent work that will prevent async-await from having any benefit?有哪些依赖工作的例子会阻止 async-await 获得任何好处?
【发布时间】:2016-12-09 23:36:35
【问题描述】:

关于async-await的快速问题。

如果我有一大段代码,比如

object foo; 
Task t1 = LongRunningTaskThatSetsFoo(out foo); 
UseFooToDoSomething(foo);
await t1; 

那么会发生什么?因为在LongRunningTaskThatSetsFoo 被允许启动的时间(第 2 行)和我们等待其结果的时间(第 4 行)之间没有任何独立的工作要做。

【问题讨论】:

  • 标记为潜在重复问题标题和“那么会发生什么?”可能是不一致的,问题更多的是关于内部的。 async / await 通常总是有好处的,因为它允许线程返回池并处理正在发生的其他事情。
  • 您不能使用带有out 参数的async 方法。如果LongRunningTaskThatSetsFoo不是async,则返回时会设置Foo
  • @Dennis_E 从技术上讲,它可能是一个仅返回 Task 的非异步方法,但即便如此,它也可能是错误的。

标签: c# .net asynchronous parallel-processing async-await


【解决方案1】:

会发生什么? LongRunningTaskThatSetsFoo 在设置foo 之前不允许返回Task,这意味着它必须在启动异步操作时提供foo,而不是在异步操作时提供foo结束。这可能只是没有意义。我想从技术上讲,您可以包含有关 LongRunningTaskThatSetsFoo 将要做什么的信息,而不是它已经做了什么,但我...持怀疑态度。

无论如何,因为foo 必须在异步操作被允许开始 之前设置(这是LongRunningTaskThatSetsFoo 返回的时候)UseFooToDoSomething 然后将使用foo,那么方法会在LongRunningTaskThatSetsFoo返回的Task完成后返回并继续执行。

您几乎肯定不想这样做。如果LongRunningTaskThatSetsFoo 产生一个值,那么它应该返回一个Task<T>,其中foo 是那个Task<T> 的结果。当然,产生结果的异步操作绝不是无用的。它们非常很有用。当前线程不能做任何依赖于结果的工作,但是他们能够执行那些依赖于结果的操作,并且让那些 >确实取决于结果,一旦计算结果就开始运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-04
    • 2017-05-19
    • 2014-07-18
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多