Asynchron
Asynchronize blocking operation.
Example
use asynchron::{Futurize, Futurized, ITaskHandle, Progress};
use std::{
convert::Infallible,
time::{Duration, Instant},
};
fn main() {
let instant: Instant = Instant::now();
let task: Futurized<String, u32, String> = Futurize::task(
0,
move |_task: ITaskHandle<String>| -> Progress<String, u32, String> {
let sleep_dur = Duration::from_millis(10);
std::thread::sleep(sleep_dur);
// Send current task progress.
let result = Ok::<String, Infallible>("The task wake up from sleep.".into());
if let Ok(value) = result {
_task.send(value);
} else {
// return error immediately if something not right, for example:
return Progress::Error(
"Something ain't right..., programmer out of bounds.".into(),
);
}
if _task.is_canceled() {
let _ = _task.send("Canceling the task".into());
Progress::Canceled
} else {
Progress::Completed(instant.elapsed().subsec_millis())
}
},
);
// Try do the task now.
task.try_do();
loop {
if task.is_in_progress() {
match task.try_get() {
Progress::Current(task_receiver) => {
if let Some(value) = task_receiver {
println!("{}\n", value)
}
// Cancel if need to.
// task.cancel()
}
Progress::Canceled => {
println!("The task was canceled\n")
}
Progress::Completed(elapsed) => {
println!("The task finished in: {:?} milliseconds\n", elapsed)
}
Progress::Error(e) => {
println!("{}\n", e)
}
}
if task.is_done() {
break;
}
}
}
}
More Example
Mixing sync and async with tokio, reqwest and fltk-rs can be found here.