【问题标题】:Chained async methods - tie a thread POV?链式异步方法 - 绑定线程 POV?
【发布时间】:2014-04-30 03:21:14
【问题描述】:

假设我有这个代码:

public void AAA()
{    
    BBB(); 
}  

public async Task BBB() 
{ 
    await Task.Delay(10000); 
}  

恕我直言,在正常模式下,方法 AAA 也应该是 async 以便主线程无需等待即可继续其工作。

但是我在这里有两个关于这种情况的问题:

  1. 说上面的代码将线程捆绑 10 秒是否正确? (我怀疑答案是肯定的,因为 AAA 不是异步的,所以没有继续注册)

  2. 如果是这样 - 我如何通过代码证明它?

【问题讨论】:

    标签: c# async-await c#-5.0


    【解决方案1】:

    说上面的代码确实将线程捆绑了 10 秒是正确的吗?

    没有。

    AAA 调用BBB,它设置了一个任务并立即返回。由于AAABBB 上没有await,所以它也会立即返回。所以“你自己的”线程没有被捆绑。

    Task.Delay 的“实现”本身使用计时器而不是阻塞线程,因此在任务期间也没有任何线程池线程被占用。

    【讨论】:

    • 所以让我们换个方式:如果 AAA 是异步的,而我在 bbb 上等待,会有什么不同?
    • @RoyiNamir:在概念上没有区别,但是对AAA 的调用不会立即返回,因此不能使用微不足道的参数“看到了吗?它不会阻塞”。实际发生的情况是,当Task.Delay 计时器到期时,线程池中的一个线程将用于运行AAA 中的其余代码,而不是计时器到期而没有人关心它。
    • Task.Delay 的实现分散了真正的答案。你能像cpu操作10秒一样回答吗?
    • @RoyiNamir:如果是一个需要 10 秒的 CPU 操作,那么显然一个线程需要运行 10 秒来执行该操作。
    • 是的,但不是主线程!我在谈论主循环线程应该服务于 GUI 或返回线程池(在 asp.net 中)的情况......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多