将回调传递给 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);
    });
}