1

我正在构建一个 Rust 库,它向 C++ 客户端应用程序公开以下简单流程:

  1. 客户端应用程序 (CA) 调用 API 来创建 FooClient,其中包括创建 tokio::Runtime。
  2. CA 调用 FooClient.lookup(" http://stackoverflow.com ", callback) ,其中 callback 是一个函数指针。
  3. FooClient 获取 URI 并将其复制到 Context 结构中。上下文结构具有对 FooClient 的 tokio::Runtime 的引用等。此上下文通过业务逻辑的几个功能传递。上下文的显式生命周期为'a,因此它比 短'static
  4. 当繁重的处理完成后,Rust 调用它给出的回调(这被转换为 FnOnce 并且工作正常)

在第 3 步的业务逻辑中,通常需要发出一个 Web 请求,我想使用&tokio::Runtime存储在 Context 中的异步调度该请求。

这是简化的代码,无法编译:

fn fork_task(context: &Context, uri: Uri, callback: FnOnce) {
   let handle = context.async_scheduler.handle().clone();
   let th = thread::spawn(move || {
       handle.block_on(async {
           call_service(context, uri);
       });
   });

   th.join().unwrap();
   callback();
}

这给我的错误是:

error[E0621]: explicit lifetime required in the type of `context`
    |
335 |     context: &Context,
    |              -------- help: add explicit lifetime `'static` to the type of `context`: `&Context<'static>`
...
348 |     let th = thread::spawn(move || {
    |              ^^^^^^^^^^^^^ lifetime `'static` required

它实际上为 spawn 中使用的每个参数抛出此错误,而不仅仅是上下文。但是,我不认为'static就在这里。我认为如果有的话,它应该是 ' a,这与我的上下文的显式生命周期相关联。

我可以做某种形式的解决方法吗?也许与Arc<Mutex<Context>>,虽然这似乎也不能正确地做我想要的。

4

0 回答 0