将回调传递给 tokio 任务
Passing callback into tokio task
我有一个将回调作为参数的函数:
fn my_function (on_complete: Box<dyn FnOnce(bool)) {
// Do some work
on_complete(false);
}
虽然我在调用之前所做的工作非常繁重,所以我试图将其生成到任务中:
fn my_function (on_complete: Box<dyn FnOnce(bool)) {
tokio::spawn(async move{
// Do some work
on_complete(false);
});
}
这给我带来了各种所有权问题,即我的 Box 无法安全地跨线程共享。我已经尝试了很多方法来解决这个问题,包括明显的方法,例如借用和更传统的线程解决方案,例如将其作为 Arc> 传递,但似乎无处可去。
关于如何正确执行此操作的任何建议?
您需要使用 Send
:
将盒装回调标记为线程安全的
fn my_function (on_complete: Box<dyn FnOnce(bool) + Send>) {
// ^^^^^^^
tokio::spawn(async move{
// Do some work
on_complete(false);
});
}
我有一个将回调作为参数的函数:
fn my_function (on_complete: Box<dyn FnOnce(bool)) {
// Do some work
on_complete(false);
}
虽然我在调用之前所做的工作非常繁重,所以我试图将其生成到任务中:
fn my_function (on_complete: Box<dyn FnOnce(bool)) {
tokio::spawn(async move{
// Do some work
on_complete(false);
});
}
这给我带来了各种所有权问题,即我的 Box 无法安全地跨线程共享。我已经尝试了很多方法来解决这个问题,包括明显的方法,例如借用和更传统的线程解决方案,例如将其作为 Arc> 传递,但似乎无处可去。
关于如何正确执行此操作的任何建议?
您需要使用 Send
:
fn my_function (on_complete: Box<dyn FnOnce(bool) + Send>) {
// ^^^^^^^
tokio::spawn(async move{
// Do some work
on_complete(false);
});
}