我正在尝试从控制台读取输入行。我使用async_std crate来读取这些行。
stdin.readline
在多个地方被调用。
是否有一种方法可以取消或刷新stdin.read_line
的前一个实例,在调用尝试再次读取stdin.read_line
之前?
锈代码:
let create_spawn = async move {
let stdin = io::stdin();
let mut input_line = String::new();
let r = stdin.read_line(&mut input_line);
let l = r.await?;
log::debug!("received the input line: {}", input_line);
Ok::<(), anyhow::Error>(())
};
let c1 = tokio::spawn(create_spawn);
delay();
// <---cancel the previous instance of `stdin.read_line` --->
let c2 = tokio::spawn(create_spawn);
您提到您使用的是async_std
,但您的样品也使用tokio
。
简化你的程序以使用async-std
,并应用一点艺术许可:
use async_std::{io, task};
use std::{thread::sleep, time::Duration};
async fn read_from_stdin() -> io::Result<()> {
let stdin = io::stdin();
let mut input_line = String::new();
println!("Waiting for input");
let r = stdin.read_line(&mut input_line);
let n = r.await?;
println!("received the input line ({} bytes): {}", n, input_line);
Ok(())
}
fn main() {
let c1 = task::spawn(read_from_stdin());
sleep(Duration::from_secs(10));
task::block_on(c1.cancel());
println!("Cancelled Input!n");
let c2 = task::spawn(read_from_stdin());
sleep(Duration::from_secs(10));
}
你不能生成相同的未来两次,所以我将你的create_spawn
移动到一个名为read_from_stdin
的异步函数中。每次调用该函数时,它将返回一个future,当从stdin中读取一行时结束。
调用task::spawn
返回一个JoinHandle
,这暴露了一个cancel
方法,该方法允许您取消已生成的任务。然后,您可以生成一个新任务来从stdin中读取。