我正在构建一个 Rust 库,它向 C++ 客户端应用程序公开以下简单流程:
- 客户端应用程序 (CA) 调用 API 来创建 FooClient,其中包括创建 tokio::Runtime。
- CA 调用 FooClient.lookup(" http://stackoverflow.com ", callback) ,其中 callback 是一个函数指针。
- FooClient 获取 URI 并将其复制到 Context 结构中。上下文结构具有对 FooClient 的 tokio::Runtime 的引用等。此上下文通过业务逻辑的几个功能传递。上下文的显式生命周期为
'a
,因此它比 短'static
。 - 当繁重的处理完成后,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>>
,虽然这似乎也不能正确地做我想要的。