在哪种情况下,异步方法将在与调用await之前使用的线程不同的线程中继续执行?

迈克尔·盖林

我了解到,在调用await之后,异步方法并不一定要在启动它们的同一线程中继续进行。

在另一个线程中继续进行异步流时,有哪些特殊情况?

是否可以强制将调用树中的所有异步方法都在同一线程中执行?(我不需要这个,只是想了解,为什么可能无法实现...)

我知道在现有SynchronizationContext的情况下,如果未调用ConfigureAwait(false),则在等待之后将再次使用原始线程。这不是这个问题的主题。

提前致谢 :)

斯蒂芬·克莱里

我知道在现有SynchronizationContext的情况下,如果未调用ConfigureAwait(false),则在等待之后将再次使用原始线程。这不是这个问题的主题。

好吧,不,是的。

不,SynchronizationContext必然意味着“同一线程”。它仅表示“相同的上下文”。如果该上下文是UI上下文,则该上下文确实引用相同的线程(UI线程)。如果该上下文是线程池上下文,则该上下文可以引用任何线程池线程。

是的,这的确是这个问题的主题,因为当前SynchronizationContextTaskScheduler如果没有current,则为current SynchronizationContext)确定了该方法在哪个线程上继续执行。

在另一个线程中继续进行异步流时,有哪些特殊情况?

await需要异步产生的点上它将捕获其上下文SynchronizationContextTaskScheduler)。当准备好恢复该方法时,将在该上下文中恢复。通常,这可以是UI上下文(绑定到特定的UI线程),也可以是线程池上下文(可以使用任何线程池线程)。

ConfigureAwait(continueOnCapturedContext: false) 覆盖该行为,并始终在线程池线程上调度继续。

请注意,在线程池的情况下,该async方法可能会或可能不会在它开始的同一线程上继续。它不一定表示不同的线程池线程-可以是任何线程池线程。

是否可以强制将调用树中的所有异步方法都在同一线程中执行?(我不需要这个,只是想了解,为什么可能无法实现...)

您不能强制执行,但可以将其设置为默认行为。您可以创建一个单线程SynchronizationContext(或TaskScheduler),然后在其中执行异步代码。如果这样做,则默认情况下await将在同一线程上继续;但是如果需要,异步代码可以仅通过使用绕过该上下文ConfigureAwait(false),然后在线程池线程上继续执行。

AsyncContext是单线程的示例SynchronizationContext

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在哪种情况下应该使用不同的.NET线程方法?

来自分类Dev

在不移动鼠标的情况下使用Synchronize在线程上调用的方法不会返回

来自分类Dev

如何找出哪种情况下挂在主线程上

来自分类Dev

在哪种情况下,不会调用onDestroy()?

来自分类Dev

在我的情况下使用线程池

来自分类Dev

JVM将在哪种情况下决定增加堆大小?

来自分类Dev

在哪种情况下,将在GEN 2垃圾收集器中进行清洁

来自分类Dev

在哪种情况下使用System.UnicodeString.Format?

来自分类Dev

在哪种情况下 AsynkTaskLoader 使用缓存数据?

来自分类Dev

在不使用传统线程原语的情况下,如何阻塞当前线程,直到OnComplete完成执行?

来自分类Dev

如何创建仅在调用线程持有锁的情况下才能运行的方法?

来自分类Dev

在这种情况下,我应该使用哪种类型的消息传递?GUI向线程发送命令;爪哇

来自分类Dev

当主线程在Python中继续执行时,如何从主线程中生成子线程

来自分类Dev

从调用线程异步执行的方法中的多个进程

来自分类Dev

在哪种情况下,应要求以管理员身份执行应用程序?

来自分类Dev

在不使用Callable的情况下从线程引发异常?

来自分类Dev

在以下情况下如何使用线程或任务模式

来自分类Dev

在以下情况下如何使用线程或任务模式

来自分类Dev

在不使用线程的情况下并行while循环

来自分类Dev

如何在不冻结线程/应用程序的情况下减慢方法的执行速度?

来自分类Dev

各种情况下的线程清理

来自分类Dev

如何在不等待当前函数/线程结果的情况下运行异步任务?

来自分类Dev

中断的线程仍继续执行

来自分类Dev

即使在使用线程池的情况下,多线程的许多短期任务也会变慢

来自分类Dev

如何在不阻塞主线程的情况下同步调用异步函数?

来自分类Dev

在不访问线程对象的情况下杀死线程

来自分类Dev

在哪种情况下,java脚本中的对象方法比较返回false

来自分类Dev

在哪种情况下,应在Javascript中在localeCompare上使用==,反之亦然?

来自分类Dev

在哪种情况下可以在C ++中使用==直接比较两个float变量?

Related 相关文章

  1. 1

    在哪种情况下应该使用不同的.NET线程方法?

  2. 2

    在不移动鼠标的情况下使用Synchronize在线程上调用的方法不会返回

  3. 3

    如何找出哪种情况下挂在主线程上

  4. 4

    在哪种情况下,不会调用onDestroy()?

  5. 5

    在我的情况下使用线程池

  6. 6

    JVM将在哪种情况下决定增加堆大小?

  7. 7

    在哪种情况下,将在GEN 2垃圾收集器中进行清洁

  8. 8

    在哪种情况下使用System.UnicodeString.Format?

  9. 9

    在哪种情况下 AsynkTaskLoader 使用缓存数据?

  10. 10

    在不使用传统线程原语的情况下,如何阻塞当前线程,直到OnComplete完成执行?

  11. 11

    如何创建仅在调用线程持有锁的情况下才能运行的方法?

  12. 12

    在这种情况下,我应该使用哪种类型的消息传递?GUI向线程发送命令;爪哇

  13. 13

    当主线程在Python中继续执行时,如何从主线程中生成子线程

  14. 14

    从调用线程异步执行的方法中的多个进程

  15. 15

    在哪种情况下,应要求以管理员身份执行应用程序?

  16. 16

    在不使用Callable的情况下从线程引发异常?

  17. 17

    在以下情况下如何使用线程或任务模式

  18. 18

    在以下情况下如何使用线程或任务模式

  19. 19

    在不使用线程的情况下并行while循环

  20. 20

    如何在不冻结线程/应用程序的情况下减慢方法的执行速度?

  21. 21

    各种情况下的线程清理

  22. 22

    如何在不等待当前函数/线程结果的情况下运行异步任务?

  23. 23

    中断的线程仍继续执行

  24. 24

    即使在使用线程池的情况下,多线程的许多短期任务也会变慢

  25. 25

    如何在不阻塞主线程的情况下同步调用异步函数?

  26. 26

    在不访问线程对象的情况下杀死线程

  27. 27

    在哪种情况下,java脚本中的对象方法比较返回false

  28. 28

    在哪种情况下,应在Javascript中在localeCompare上使用==,反之亦然?

  29. 29

    在哪种情况下可以在C ++中使用==直接比较两个float变量?

热门标签

归档