Передача обратного вызова в задачу tokio - PullRequest
0 голосов
/ 08 мая 2020

У меня есть функция, которая принимает обратный вызов в качестве параметра:

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 нельзя безопасно разделить между потоками. Я пробовал несколько способов обойти это, в том числе очевидные, такие как заимствование, и более традиционные решения для потоковой передачи, такие как передача его как Ar c>, но, похоже, ничего не добился.

предложения, как это сделать правильно?

1 Ответ

1 голос
/ 08 мая 2020

Вам нужно пометить свой обратный вызов в штучной упаковке как потокобезопасный с помощью Send:

fn my_function (on_complete: Box<dyn FnOnce(bool) + Send>) {
//                                               ^^^^^^^
    tokio::spawn(async move{
        // Do some work
        on_complete(false);
    });
}
...