Crates.io | asynchron |
lib.rs | asynchron |
version | 0.9.1 |
source | src |
created_at | 2021-04-13 18:39:50.682412 |
updated_at | 2021-09-24 04:47:13.666381 |
description | Asynchronize blocking operation. |
homepage | |
repository | https://github.com/Ar37-rs/asynchron |
max_upload_size | |
id | 383054 |
size | 45,739 |
Asynchronize blocking operation.
use asynchron::{Futurize, Futurized, ITaskHandle, Progress};
use std::{
io::Error,
time::{Duration, Instant},
};
fn main() {
let instant: Instant = Instant::now();
let task: Futurized<String, u32> = Futurize::task(
0,
move |_task: ITaskHandle<String>| -> Progress<String, u32> {
// // Panic if need to.
// // will return Error with a message:
// // "the task with id: (specific task id) panicked!"
// std::panic::panic_any("loudness");
let sleep_dur = Duration::from_millis(10);
std::thread::sleep(sleep_dur);
let result = Ok::<String, Error>(
format!("The task with id: {} wake up from sleep", _task.id()).into(),
);
match result {
Ok(value) => {
// Send current task progress.
_task.send(value)
}
Err(e) => {
// Return error immediately if something not right, for example:
return Progress::Error(e.to_string().into());
}
}
if _task.should_cancel() {
_task.send("Canceling the task".into());
return Progress::Canceled;
}
Progress::Completed(instant.elapsed().subsec_millis())
},
);
// Try do the task now.
task.try_do();
let mut exit = false;
loop {
task.try_resolve(|progress, done| {
match progress {
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 done {
// This scope act like "finally block", do final things here.
exit = true
}
});
if exit {
break;
}
}
}
Unblock blocking ureq or reqwest with fltk-rs can be found here.