Tokio 的 Handle::block_on 与 Runtime::block_on 有何不同?

How does Tokio's Handle::block_on differ from Runtime::block_on?

tokio::runtime::Handle.block_ontokio::runtime::Runtime.block_on 有何不同? Handle.block_on 导致一些代码挂起,而 Runtime.block_on 工作正常。

这就是我创建 Handle 的方式。 Runtime 与减去最后 2 行相同。

let runtime = runtime::Builder::new_multi_thread()
    .enable_all()
    .build()
    .unwrap()
    .handle() // not needed for Runtime
    .clone(); // ---

然后我调用一个函数:

async fn run(){
    // calls get data
}

self.runtime.block_on(run())

这是它挂起的代码。当 Runtime 的 运行 工作正常时,Handle 它挂在 TcpStream::connect()

async fn get_data(addr: String) -> Result<Data> {
    let c = TcpStream::connect(addr.clone()).await?; // hangs here
    let t = get_data_from_connect(c).await?;
    return Ok(t);
}

我通过确保 Runtime 对象不会超出范围并被删除来修复此问题。我的印象是只需要 Handle 来保持运行时活动,但 only the Runtime object itself can.